JOS JOS Compositor

The app

Autodesk Flow Production Tracking

New. An optional plugin connects JOS to Autodesk Flow Production Tracking (formerly ShotGrid): tick it in the installer, or download it (Pipeline plugins). With it you can open a task's work file, render with Writes that know where they belong, publish renders and movies for review, and load what others published. Its menu is Pipeline > Flow Production Tracking.

The plugin talks to your Flow site directly, through Flow's Python API. It doesn't need Toolkit, Flow Production Tracking Desktop or a pipeline configuration. Studios that run Toolkit can use it beside Toolkit.

JOS isn't made or endorsed by Autodesk. Flow Production Tracking is a trademark of Autodesk, Inc.

Connecting

Pipeline > Flow Production Tracking > Settings...

Connect checks the sign-in before saving it. Keys and tokens are encrypted for your Windows account, so they can't be read on another account or computer.

For pipeline teams

Point the JOS_FLOW_CONFIG environment variable at a JSON file on a share, and every artist gets the same settings. Its keys:

Key What it sets Default
site, script_name The site and script (also JOS_FLOW_SITE, JOS_FLOW_SCRIPT_NAME; the key can come from JOS_FLOW_SCRIPT_KEY)
root, roots The projects folder, and one per Flow project name: {"Demo": "P:/demo"}
work_file Where work files go {root}/{project}/{entity_folder}/{sequence}/{entity}/{step}/work/{entity}_{task}_v{version:03d}.joscomp
publish_file Where a published work file is copied the same, in publish/
render_file Where a Flow Write renders .../render/v{version:03d}/{output}/{entity}_{task}_{output}_v{version:03d}.%04d.exr
review_file Where the review movie goes .../review/{entity}_{task}_{output}_v{version:03d}.mp4
cut_in_field, cut_out_field The Shot fields with its frame range sg_cut_in, sg_cut_out
publish_types The PublishedFile types used (made on the site when missing) JOS Project, Rendered Image, Movie
version_status, task_status Statuses set when publishing ("" leaves them alone) rev, ""

Templates are Python format strings. Their keys:

An empty key, such as an asset's sequence, leaves no empty folder in the path. Each artist's own settings (flow.json beside JOS's plugin folder) override the studio's.

Working on a task

Open Work File... lists the site's projects, then their shots or assets (with a filter), their tasks, and the task's work files on disk:

The project remembers its task, so reopening it later (from anywhere) keeps it connected. Current Context says which task and version the open project is.

Save Next Version saves the project as the next version, after every work and published version already on disk. Flow Writes follow it.

Set Frame Range from Shot takes the project's frame range from the shot's cut in and out.

Flow Writes

Create Flow Write (also Flow Write in the Tab node picker, under Flow plugin) adds an ordinary Write after the selected node. Its path comes from the render template and follows the project's version. Everything else is the usual Write: file type, channels, compression, colour. A second Flow Write gets its own output folder (main2...). The Write shows:

Publishing

Publish... shows the Flow Writes that have rendered, a description, and these options:

A version that's already published can't be published again: save the next version first. Fields your site doesn't have are left out, so a site with a different setup still works.

Loading

Load Published... lists the shot's or asset's PublishedFiles, newest first. Load (or a double-click) does this:

Open in Flow opens the task's page on the site in your web browser.

In scripts

The plugin is the Python package jos_flow. It works in the Script Editor and headless in jos-python:

import jos, jos_flow

jos_flow.connect()
project = jos_flow.projects()[0]
shot = jos_flow.entities(project, "Shot")[0]
task = jos_flow.tasks(shot)[0]
jos_flow.open_task(jos_flow.make(project, shot, task))  # the latest version, or v001
write = jos_flow.create_write()
jos.render(write.name)
print(jos_flow.publish(description="first pass").summary())

Not yet