Skip to main content

Producer paper edit to Premiere Pro sequence generator

Project description

Sheetscut

License: MIT Python 3.9+ No Dependencies

Convert producer paper edits into Premiere Pro sequences automatically.

The Problem

Documentary and interview editors know this workflow: producers review transcripts and copy/paste the text chunks they want into a "paper edit" — essentially a text document of selected quotes arranged in order. The editor then manually finds each quote in the timeline and assembles the rough cut. It's tedious and time-consuming.

The Solution

Sheetscut matches the producer's text selections back to word-level timecodes in the original transcript, then generates an FCP XML file that Premiere Pro imports as a ready-made sequence.

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│  Video File     │────▶│  Transcribe     │────▶│  JSON Transcript│
│                 │     │  (Premiere Pro) │     │  (word-level TC)│
└─────────────────┘     └─────────────────┘     └────────┬────────┘
                                                         │
┌─────────────────┐     ┌─────────────────┐              │
│  Premiere Pro   │◀────│  Sheetscut      │◀─────────────┤
│  Rough Cut      │     │  (this tool)    │              │
└─────────────────┘     └────────┬────────┘              │
                                 │                       │
                        ┌────────┴────────┐              │
                        │  Producer       │◀─────────────┘
                        │  Paper Edit     │
                        │  (text chunks)  │
                        └─────────────────┘

Installation

pip install sheetscut

Or install from source:

git clone https://github.com/mrescandon/sheetscut.git
cd sheetscut
pip install .

Quick Start

# Basic usage - paste text interactively
sheetscut transcript.json

# Provide text inline
sheetscut transcript.json -t "The text you want to find in the transcript"

# Read text from a file
sheetscut transcript.json -i paper_edit.txt

# Specify output path
sheetscut transcript.json -i paper_edit.txt -o rough_cut.xml

Then import the generated XML file into Premiere Pro (File → Import).

Usage

Command Line

sheetscut TRANSCRIPT [OPTIONS]

Arguments:

  • TRANSCRIPT — Path to Adobe JSON transcript file (required)

Input Options:

  • -t, --text TEXT — Producer text inline
  • -i, --input FILE — Producer text from file
  • (no flag) — Reads from stdin interactively

Output Options:

  • -o, --output FILE — Output XML path (default: output_sequence.xml)
  • -q, --quiet — Suppress progress output

Matching Options:

  • --no-fuzzy — Disable fuzzy matching (exact matches only)
  • --threshold FLOAT — Fuzzy match threshold, 0.0-1.0 (default: 0.85)
  • --error-duration FLOAT — Error slug duration in seconds (default: 3.0)

Media Options:

  • -m, --media PATH — Source media path for XML
  • --framerate FLOAT — Video framerate (default: 29.97)

Pro Editing:

  • --continuous — Merge continuous clips and mark jump cuts (see below)

Other:

  • -v, --version — Show version number

Python Library

from sheetscut import process_paper_edit

result = process_paper_edit(
    transcript_path="interview.json",
    producer_text="The quotes I want to use from the interview.",
    output_path="rough_cut.xml",
    fuzzy_matching=True,
    fuzzy_threshold=0.85,
    continuous_mode=True
)

print(f"Matched {result['matched']} clips, {result['failed']} failed")

Features

Fuzzy Matching

When exact text matching fails (due to typos, formatting differences, or transcription errors), Sheetscut uses fuzzy matching to find approximate matches. Fuzzy matches are flagged with markers in the timeline so you can verify them.

# Adjust sensitivity (0.0-1.0, higher = stricter)
sheetscut transcript.json -t "Text" --threshold 0.90

# Disable fuzzy matching entirely
sheetscut transcript.json -t "Text" --no-fuzzy

Error Handling

When text cannot be matched at all, Sheetscut inserts a visible "error slug" on the timeline with the unmatched text, plus a marker. The sequence continues processing — one failed match doesn't stop the whole edit.

Continuous Mode

For professional rough cuts, use --continuous to merge clips that are continuous in source timecode and mark actual discontinuities:

sheetscut transcript.json -i paper_edit.txt --continuous

What it does:

  • Merges adjacent clips that are continuous in the source (no gap)
  • Adds red markers at actual jump cuts (where content was removed)
  • Marker comments show gap duration and source timecode range

Why it matters: When a producer selects consecutive sentences, they may or may not be continuous in the source. Continuous mode makes internal jump cuts visible so editors know where B-roll or cutaways are needed.

Transcript Requirements

Sheetscut requires word-level timecodes in JSON format. Currently, this is available from:

  • Adobe Premiere Pro Beta 26.1+ — Export transcript as JSON
  • WhisperX — With word-level timestamps enabled

The JSON structure should include word-level timing:

{
  "segments": [
    {
      "speaker": "speaker-id",
      "words": [
        {"text": "Hello", "start": 1.2, "duration": 0.3},
        {"text": "world", "start": 1.5, "duration": 0.4}
      ]
    }
  ]
}

Note: Standard transcript exports (CSV, TXT, SRT) only have segment-level timing and won't work.

Output Format

Sheetscut generates FCP XML (version 4), which Premiere Pro imports natively. The sequence includes:

  • Video track with matched clips
  • Stereo audio tracks (properly linked)
  • Markers for fuzzy matches and errors
  • Error slugs as text generators for failed matches

Requirements

  • Python 3.9 or higher
  • No external dependencies (stdlib only)

Examples

Process a single quote:

sheetscut interview.json -t "I think the most important thing is authenticity"

Process a full paper edit from file:

sheetscut interview.json -i producer_selects.txt -o rough_cut.xml --continuous

Use with 23.976 footage:

sheetscut interview.json -i selects.txt --framerate 23.976

Strict matching only:

sheetscut interview.json -i selects.txt --no-fuzzy

Limitations

  • Requires word-level JSON transcripts (segment-level formats won't work)
  • Generated XML uses filenames only, not full paths — Premiere will prompt to relink media on import
  • Marker colors are limited by FCP XML spec (Premiere shows all markers as olive)
  • Cannot reference existing project items like multicam sequences

Contributing

Contributions are welcome! Please feel free to submit issues and pull requests.

License

MIT License — see LICENSE for details.

Credits

Created by Paul Escandon / Media Pending, LLC

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sheetscut-0.1.0.tar.gz (19.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sheetscut-0.1.0-py3-none-any.whl (22.7 kB view details)

Uploaded Python 3

File details

Details for the file sheetscut-0.1.0.tar.gz.

File metadata

  • Download URL: sheetscut-0.1.0.tar.gz
  • Upload date:
  • Size: 19.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sheetscut-0.1.0.tar.gz
Algorithm Hash digest
SHA256 390888a56557a43cb4af50877e6faa17b96a75650b29017718593c04d6565528
MD5 0a1765615f4b7be0dc7ad1fb3f832b3e
BLAKE2b-256 6d6157f7c30e6fc411d257a082ff970fa713306dce6737e019a97025c48f98b6

See more details on using hashes here.

Provenance

The following attestation bundles were made for sheetscut-0.1.0.tar.gz:

Publisher: publish.yml on mrescandon/sheetscut

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sheetscut-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: sheetscut-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 22.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sheetscut-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 12de197f3f0c4a980ba2538a134bc94284fd16772cfd677f5ec8c88f538f37bf
MD5 65fd8e44b844e7db8c7f561093ff0083
BLAKE2b-256 1bb2d52d292a0f4568d73ee4dc496fc97f351ba8be55568630563fae37d98419

See more details on using hashes here.

Provenance

The following attestation bundles were made for sheetscut-0.1.0-py3-none-any.whl:

Publisher: publish.yml on mrescandon/sheetscut

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page