Giter Club home page Giter Club logo

universalschedulestandard / universalschedulestandard Goto Github PK

View Code? Open in Web Editor NEW
11.0 4.0 1.0 2.55 MB

Proposal for a standardized format to store and transport production schedules and breakdowns across the entertainment industry

Home Page: https://github.com/UniversalScheduleStandard/UniversalScheduleStandard

License: Other

entertainment-industry script-breakdowns proposal breakdowns schedules format standard standards schedule entertainment

universalschedulestandard's Introduction

USS Logo

A standardized format to store and transport
production schedules and breakdowns across the entertainment industry


GitHub tag (latest by date) GitHub issues GitHub closed issues GitHub pull requests GitHub closed pull requests License: CC BY-NC-ND 4.0

The Problem

No Communication

Production schedules are indispensable documents in the entertainment industry, containing the core information that is consumed both during prep and on set.

An increasing number of software tools have been created that either create or consume this schedule data. Unfortunately, the creators of these tools and their users found that there was no easy way to transport this data from one application to another.

When transportability problems like this have occurred in the past, creators had tended to generate their own custom import/export solutions. This inevitably resulted in a fractured landscape of multiple file formats that needed to be maintained and supported.

Additionally, unnecessary resources were placed on promoting file formats, which bring little value to their creators and only served to ultimately annoy the end user.

The Solution - Universal Schedule Standard

Communication

The Universal Schedule Standard is a method to store and transport schedule and breakdown data across all existing and future platforms.

Using one standard makes the user's data portable, allowing them to create a schedule in one application and then transfer that information to another application that might create budgets, call sheets or other useful end products.

Each company using the standard has reduced their work load, as they avoid supporting myriad competing formats. These various applications are lighter and more easily manageable with only one import/export format to support.

And perhaps most importantly, end users gain confidence in the entire sector and will more freely use multiple services, with the knowledge that their data is always portable and safe.

Features

The standard has been carefully crafted to serve all sectors of the entertainment industry. It allows for:

  • Transport - use it to easily move entire schedules or breakdowns between applications or services
  • Storage - provides a common format for legacy data
  • Future Proofing - stores data in a simple text format that will be readable by any system in the future
  • Flexibility - the schedule and breakdown data are stored separately, allowing for the storage of just breakdown data without a schedule, if desired
  • Storage of Metadata - includes important additional data such as calendars, multiple stripboards, individual settings for elements, etc.
  • Conforms to the Universal Category Identification standard so that all breakdown categories are easily identified and parsed
  • Open standard - no licensing fees - free to use
  • Not reliant on any third party resources or services
  • Is extensible if you'd like to store additional data
  • Works interchangeably as a file and as data in an API call

Details

This standard has been designed as a concise way to store as much schedule and breakdown data as possible in a format that is both human and machine readable.

The schedule and breakdown data are stored in JSON format, allowing for easily parsable import/export operations either in a saved file or through an API call.

Here is an example of the entire standard object:

{
  "universalScheduleStandard": {
    "id": "5d9fc8cfc0efae0017a32a11",
    "author": "Jane Smith",
    "company": "RKO Pictures",
    "created": "2022-10-07T00:12:06.000Z",
    "description": "This is a description of the schedule",
    "episode": "101",
    "episodeName": "Pilot",
    "name": "My schedule name",
    "project": "It's A Wonderful Life",
    "schedColor": "Blue",
    "schedDate": "2022-10-07T07:00:00.000Z",
    "scriptColor": "Yellow",
    "scriptDate": "2022-10-01T07:00:00.000Z",
    "season": "S03",
    "source": "Name of originating site or app",
    "ussVersion": "1.0.0",

    "breakdowns": [],
    "categories": [],
    "elements": [],
    "stripboards": [],
    "calendars": []
  }
}

The last five items in this object are where the schedule and breakdown data are stored. That data is merely a series of additional sub-objects that are stored in those arrays.

Examples

See the small sample file in the /samples folder for a brief example. To keep the sample file as readable as possible, it only contains one scene and a few elements. A full sample schedule of course contains more data and illustrates a real world implementation of the standard on a full schedule.

Validator

We have created a simple validator function that takes a USS object and parses it for validity. See more about that project here.

Web Site

More information is available on the Universal Schedule Standard website, at universalschedulestandard.org.

Documentation

For detailed instructions about the structure and format of the standard object, please read the detailed documentation found in the /docs folder.

Collaborators

The following collaborators proudly support the Universal Schedule Standard:

License

Creative Commons License
This work is licensed under a Creative Commons Attribution-NoDerivatives 4.0 International License.

universalschedulestandard's People

Contributors

modemmute avatar thinkcrew avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

bboscoe

universalschedulestandard's Issues

Restructuring the relationship between breakdowns and strips, extending stripboard options

First off, Michael -- thank you so much for your work on this! It's so exciting to see it come together. I spent 3+ hours combing through all this and really analyzing it deeply. You've done a great job covering many different bases and documenting everything thoroughly.

This is by far the biggest feedback item I'd like to suggest. It is a little complex to explain, so thanks for hanging with me.

For context, I would like to note that I approach this from the perspective of working with call sheets and some of the detailed schedule data that is needed in those contexts that might exceed the detail found on a typical one-liner. Taking the approach I suggest below requires a slight shift away from the Movie Magic Scheduling approach to stripboards and focusing more on creating a structure that could accommodate either basic stripboard-like schedules or very complex on-the-ground call sheet schedules.

Also, it's very possible I'm missing something in this, so feel free to point out holes in my thought process.

The issue:

Currently, some schedule-related data is stored in the "breakdowns" object in the form of days and banners. These objects are then referenced when being tagged in a schedule.

This is not ideal for a few reasons:

  • There is a lack of separation between scene breakdown data and scheduled related data. Ideally, I feel that there should be a hard separation between scene breakdown data and schedule data.
  • The current approach results in a lot of unnecessary fields that are left null. For instance, if I have a schedule with 50 days, I will have 50 duplicate objects in the "breakdown" array that are essentially completely blank objects. Here is an example:
{
  "id": "6009aa7efac8810c058d304d",
  "type": "day",
  "scene": null,
  "description": null,
  "scriptPage": null,
  "pages": null,
  "time": null,
  "comments": null,
  "created": "2022-06-11T00:12:02.000Z",
  "elements": []
}
  • Currently, breakdown items are placed in a stripboard simply by being listed in an array of IDs under the boards -> breakdownIDs field, as shown here:
{
  "id": "5cff4bcb10c4330017ab6da1",
  "name": "stripboard",
  "breakdownIds": [
    "5e2dd860fb4b2900171967fc",
    "5e2dd860fb4b2900171967fe",
    "5e2dd860fb4b290017196800",
    "5e2dd860fb4b290017196802" 
   ]
}

While this does the job of putting the elements in order, it is very limited in the ways it could be extended because there is no room for adding any metadata to an item on the schedule other than its order. This becomes a particular problem when working on schedules that might have specific notes that need to be added to items listed on the schedule or when working on a shoot where specific times or locations must be assigned to items on the schedule.

The proposed solution:

Remove the type field from the breakdown object. This would make all breakdown objects scenes by definition, since “days” and “banners” are functions of schedules, not of breakdowns.

Under the Stripboard -> boards array, the breakdownIds field should be renamed to stripElements (or something similar) and instead of being an array of string ids, should be extended into an array of objects. Please look over the following example:

{
  "id": "5cff4bcb10c4330017ab6da1",
  "name": "stripboard",
  "stripElements": [
     {
        "breakdownId" : "5e2dd860fb4b2900171967fc",
        "dayGroup" : 1,
        "bannerText" : null,
        "notes" : null,
        "startTime" : 09:00:00,
        "endTime" : 11:30:00
     },
     {
        "breakdownId" : "5e2dd860fb4b2900171967fe",
        "dayGroup" : 1,
        "bannerText" : null,
        "notes" : null,
        "startTime" : 11:30:00,
        "endTime" : 12:15:00
     },
     {
        "breakdownId" : null,
        "dayGroup" : 1,
        "bannerText" : "Lunch Break",
        "notes" : "MUST BOARD SHUTTLES: All cast and crew should take shuttles buses which will waiting near crew parking area for transport to the lunch location.",
        "startTime" : 12:15:00,
        "endTime" : 13:15:00,
        "_locationLatLong" : "47.45411460402577, -122.30092520253127",
        "_anotherCustomField" : "This allows custom data, such as exact location data, shot information, or even links to attachments such as parking maps to be added to any object on the schedule, including company move banners or scenes themselves."
     },
      {
        "breakdownId" : "5e2dd860fb4b2900171967fe",
        "dayGroup" : 1,
        "bannerText" : null,
        "notes" : null,
        "startTime" : 13:15:00,
        "endTime" : 18:15:00
     },
     {
        "breakdownId" : "5e2dd860fb4b290017196800",
        "dayGroup" : 2,
        "bannerText" : null,
        "notes" : null,
        "startTime" : null,
        "endTime" : null
     },
     {
        "breakdownId" : null,
        "dayGroup" : 2,
        "bannerText" : "This is just a banner",
        "notes" : null,
        "startTime" : null,
        "endTime" : null
     },
     {
        "breakdownId" : "5e2dd860fb4b290017196802",
        "dayGroup" : 2,
        "bannerText" : null,
        "notes" : "Due to COVID restrictions, only skeleton crew will be asked to stay for this pickup shot of scene 34. This is a comment on a scene object, allowing schedule-specific notes to be added to scenes within the schedule if needed.",
        "startTime" : null,
        "endTime" : null
     }
   ]
}

Here is a description of these fields:

  {
        "breakdownId" : string | this is the id of the scene breakdown that is being tagged | can be null,
        "dayGroup" : integer | this is used to group strips together into days. Any items with the same dayGroup number occur on the same day | required,
        "bannerText" : string | if this strip is a banner, the banner text should go here. If it is not a banner, this will be left null | can be null,
        "notes" : string | this optional field allows notes to be added to any item on the schedule. This typically would be used to add specific reminders or instructions that are directly pertinent to this scene or banner or company move | can be null,
        "startTime" : time (HH:mm:ss) | this optional field allows a start time to be specified to the schedule item. If no start time is needed, simply leave blank | can be null,
        "endTime" : time (HH:mm:ss) | this optional field allows an end time to be specified to the schedule item. If no end time is needed, simply leave blank | can be null
     }

Benefits of this approach

The key benefits of switching to this approach are as follows:

  • Improved separation of concerns. The "breakdowns" object only contains scene breakdown information, not schedule banners and day items.

  • The extensibility of the schedule is increased by allowing users to add more metadata to any item on the schedule. This includes the option to add both start and end times to schedule items (this is very important on certain shoots that may be working on strict and detailed time schedules) as well as adding schedule-specific comments to any stripboard item. Additionally, custom elements could be added using the underscore technique. For instance, if there was a company move to somewhere with a specific GPS coordinate, that could be added as a custom element called "_locationLatLong".

  • Null data duplication is reduced The need to store duplicate, identical "day break" strips as their own breakdown items could be eliminated. By simply specifying a "dayGroup" field on the schedule items, it's easy to tell what items occur on the same day within the schedule and thus day break elements can easily be auto-generated between day groups when displayed schedules, etc. (note: this change is optional.)

Drawbacks of this approach

I'd love to hear if there are any drawbacks to this approach that others see. So far, I'm not seeing any big ones; however, there very well could be implications that I'm not seeing.


I hope this is helpful! As always, feedback and improvement to this suggestion are welcome.

Thanks for all the effort you've put into this, Michael!
Luke @ SetHero ([email protected])

Rename `time` field on Breakdown object to `duration`

I would propose renaming the time field on Breakdown object to duration. Duration is a more accurate description and using the name "time" could mislead people into thinking it is specifying the time of day (such as 12:30pm) rather than the duration.

{
  "id": string | UUID value | required,
  "comments": string | can be null,
  {....}
  "duration": number | millisecond duration to shoot scene | can be null,
   {....}
}

Luke @ SetHero ([email protected])

Questioning documentation on breakdown & stripboard array lengths

I have a question on this specific section of the documentation, which is found under the header Board Objects:

"The length of the combined arrays of the breakdownIds across all boards within a stripboard object must be equal to the total number of breakdown objects in breakdowns. For example, say you have two boards -- 'stripboard' which has 75 IDs and 'boneyard' which has 25 IDs -- you must have a total of 100 breakdown objects in your breakdowns array. Breakdown objects that are not referenced in a boards.breakdownIds array will be ignored."

I'm curious how this rule applies when having multiple stripboard versions. For instance, what if I had one board that was 1st unit, one board that was 2nd unit, add another board that was an alternate schedule version that I want to have saved as a backup. Between these three boards, it's very likely that some scenes would be listed on multiple strip boards. (For instance, my alternate schedule version might contain many of the same scenes as my first unit schedule, but in a slightly rearranged order.)

In such a case, the rule above which states that the total sum length of both arrays should be equal would not apply. I might be missing something in the way I'm interpreting this, but I wanted to double-check. Thanks!

Luke @ SetHero ([email protected])

Modeling the relationship between Category and Element

Elements and Categories

In the mental model of the USS, Categories are a static list/taxonomy, and each Element belongs to exactly one Category.

Current Implementation

The current version of the USS models this relationship between by including an array of Element IDs inside the definition of the each Category.

{
  ...,
  elements: [{id: 'abc', ...}],
  categories: [{id: '123', elements: ['abc',...], ... }]
 }

Some of the drawbacks of this approach include

  • The onus is on the developer to validate that every element is contained within exactly one category, which can be easily overlooked
  • The act of changing the category of an element is a 2 step process: it must be removed from the old list and added to the new list
  • It is slightly more work to see at a glance which category an element belongs to

Suggested Change

It could be beneficial to model this relationship in the following way:

  • each Element has a required categoryId field
  • remove the elements array from Category
{
  ...,
  elements: [{id: 'abc', categoryId: '123', ...}],
  categories: [{id: '123', ...}]
}

The same information is captured in this suggested model, but the rules of the relationship no longer require validation (each element belongs to exactly one category), and it is slightly easier to follow this relationship. The categories also become simpler, and look more like a static taxonomy which is in line with the mental model (and other models of taxonomies or "tags").

I hope this helps! Feedback on this suggestion is welcome, as well as additional context on how the current implementation came to be.

Thanks for all the work that you do!
Nick @ Cinapse ([email protected])

Rename `version` field to make more clear that this is for the USS version

The issue:

Currently, there is a field on the root universalScheduleStandard object named "version". To most people reading through this object (including myself), I think the version field would be interpreted as containing a version name or number for the production or breakdown data, rather than a place for indicating the current version of the USS standard being used.

Proposed Solution:

I would recommend one of the following solutions:

  1. Rename the "version" field to ussVersion or formatVersion or something similar to this to make clear that it should not be used to store project or breakdown version data.

  2. Move the "version" field outside of the universalScheduleStandard object and to the very top of the JSON object, such as this:

{
  "version" : "1.0.2" 
  "universalScheduleStandard": {
    "id": string | UUID value | required,
    "author": string | name of individual creator | can be null,
    "company": string | name of the company for which the schedule was created | can be null,
    [ .... ]
  }
}

Personally, I think I'm leaning toward option 2. But interested to hear what others think!

Thanks!
Luke @ SetHero ([email protected])

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.