foley.provenance.credits#
TASL attribution / credits generator — the provenance render layer (#9a).
Turns the sounds used in a foley run into a credits block (human-readable
CREDITS.md) and a machine-readable JSON manifest, honoring the Creative
Commons TASL recipe — **T**itle, **A**uthor, **S**ource, **L**icense — plus a
modification notice and a forward-compatible AI-disclosure line.
Design (report 07 · 10 §``provenance/``):
**Reads the
LicenseRecordSSOT; never re-derives license flags.** Each credit is built purely from fields already on the record (creator_name/source_url/license_id/requires_attribution/transformations/is_ai_generated…) plus the display name + URL looked up fromfoley.licensing.license_meta().Never discard provenance. Every sound is credited — including CC0 and user-owned ones that need no legal attribution — while the per-entry
requires_attributionflag in the JSON manifest marks which credits are legally required.Graceful degradation. Every optional field has an ordered fallback (a missing caption synthesizes a title from tags; a missing creator falls back to the source), so a credit is always producible — even from a bare
LicenseRecord.Stdlib-only + deterministic. No heavy deps and no timestamps, so
CREDITS.md/credits.jsonare byte-stable and diffable. The AudioSeal watermark / C2PA writers + the EU AI Act Art. 50 checklist are the siblingdisclosure.py(#9b, after generation); this module only reads those fields off the record and passes them through the manifest.
Module Attributes
a full record, a ranked candidate, or a bare rights record (each yields one credit entry). |
Functions
|
Render one sound's TASL attribution line. |
|
Build a |
|
Build the deduplicated |
|
The machine-readable manifest for |
|
Render |
Classes
|
One rendered TASL credit for a single sound (a flat, serializable row). |
|
A deduplicated, ordered collection of |
- class foley.provenance.credits.CreditEntry(sound_id, title=None, author=None, author_url=None, source=None, source_url=None, license_id='unknown', license_name=None, license_url=None, modified=False, requires_attribution=False, attribution_text=None, notice_text_required=None, is_ai_generated=False, generator_model=None, disclosure_recommended=False, watermark=None, c2pa_manifest_ref=None)[source]#
Bases:
SerializableMixinOne rendered TASL credit for a single sound (a flat, serializable row).
Built by
credit_entry()from a record’s rights fields; rendered to a single attribution line byattribution_line(). Carries the AI-disclosurewatermark / C2PA fields as pass-throughs so the JSON manifest becomes the content-credentials carrier once #6/#9b populate them (
Nonetoday).
- foley.provenance.credits.CreditInput#
a full record, a ranked candidate, or a bare rights record (each yields one credit entry).
- Type:
What the credits layer accepts
alias of
SoundRecord|Candidate|LicenseRecord
- class foley.provenance.credits.Credits(entries=(), title='Credits', schema_version=1)[source]#
Bases:
SerializableMixinA deduplicated, ordered collection of
CreditEntryfor one run.Iterable and sized; renders to
CREDITS.mdviamarkdownand to a JSON manifest viamanifest(==to_dict()). Both are deterministic (no timestamps) and diffable.
- foley.provenance.credits.attribution_line(source, *, fmt='markdown')[source]#
Render one sound’s TASL attribution line.
A source-supplied
attribution_text(if non-empty) is returned verbatim; otherwise the line is synthesized from Title/Author/Source/License, with a(modified)notice and an AI-disclosure segment appended as applicable.- Parameters:
source (
Union[CreditEntry,SoundRecord,Candidate,LicenseRecord]) – ACreditEntry, or any credit input (coerced first).fmt (
str) –'markdown'(hyperlinked list-item body) or'plain'(text with URLs in parentheses).
- Return type:
- Returns:
The attribution line (no leading bullet / trailing newline).
- foley.provenance.credits.credit_entry(record, *, title=None)[source]#
Build a
CreditEntryfrom a record (title override optional).Every field is read straight off the
LicenseRecord(flags never re-derived);modifiedreflects a non-emptytransformationslist.- Parameters:
record (
Union[SoundRecord,Candidate,LicenseRecord]) – ASoundRecord,Candidate, orLicenseRecord.title (
Optional[str]) – Explicit title override (else resolved from caption/tags/…).
- Return type:
- foley.provenance.credits.credits_for(sounds, *, title='Credits', only_required=False, sort='appearance')[source]#
Build the deduplicated
Creditsfor the sounds used in a run.- Parameters:
sounds (
Iterable[Union[SoundRecord,Candidate,LicenseRecord]]) – An iterable of records / candidates / license records.title (
str) – The credits heading (also carried in the manifest).only_required (
bool) – Keep only entries whose license requires attribution (drops CC0 / user-owned courtesy credits). DefaultFalsecredits everything (never-discard-provenance).sort (
str) –'appearance'(default: first-seen order),'author', or'title'(case-insensitive alpha).
- Return type:
- Returns:
A
Credits; identical sounds (same id) are credited once (first-writer-wins).
- foley.provenance.credits.credits_manifest(credits)[source]#
The machine-readable manifest for
credits— a JSON-native dict.entriesis a plainlistof per-credit dicts (not thetuplethatdataclasses.asdictwould preserve), so the manifest equalsjson.loads(credits.to_json())— the exact shape written tocredits.json. It carries the full field set, including therequires_attributionmark and thewatermark/c2pa_manifest_refpass-throughs (Noneuntil #9b).- Return type:
- foley.provenance.credits.render_credits_md(credits, *, title=None, heading_level=2)[source]#
Render
creditsas a deterministicCREDITS.mddocument.- Parameters:
- Return type:
- Returns:
The Markdown document (bulleted attribution lines; a placeholder note when empty), ending in a single trailing newline.