Snippets

Lucas Correia API Example - Create media in encoding state

Created by Lucas Correia last modified

Create test project for encoding media

Instructions

  1. Clone this repository
  2. Activate a python virtual environment with ftrack-python-api installed.
  3. Ensure you have credentials in environment for the demo docker (e.g. source ~/dev/ftrack-spark-dev-backend/api_credentials.sh)
  4. Run the script python create_test_encoding_media.py
# :coding: utf-8
# # :copyright: Copyright (c) 2020 ftrack
import os.path
import json
import logging

import ftrack_api

logger = logging.getLogger('create_test_media')


PROJECT_NAME = 'Encoding test project'
MEDIA_DIRECTORY = os.path.dirname(__file__)
THUMBNAIL_FILE = os.path.join(MEDIA_DIRECTORY, 'thumbnail.jpg')
MEDIA_720 = os.path.join(MEDIA_DIRECTORY, 'ftrackreview-mp4.mp4')
MEDIA_1080 = os.path.join(MEDIA_DIRECTORY, 'ftrackreview-mp4-1080.mp4')
MEDIA_2160 = os.path.join(MEDIA_DIRECTORY, 'ftrackreview-mp4-2160.mp4')
TEST_VIDEO_URL = os.environ.get('TEST_VIDEO_URL')

def upload_media(session, asset_version, file_path, name='ftrackreview-mp4'):
    server_location = session.get('Location', ftrack_api.symbol.SERVER_LOCATION_ID)
    component = asset_version.create_component(
        path=file_path,
        data={'name': name},
        location=server_location
    )
    return component


def create_asset(session, parent, name, asset_type=None):
    if asset_type is None:
        asset_type = session.query('AssetType where name is "Upload"').one()

    asset = session.create('Asset', {
        'name': name,
        'type': asset_type,
        'parent': parent
    })
    session.commit()
    asset_version = session.create('AssetVersion', {
        'asset': asset
    })
    session.commit()
    return asset_version


def clean_up(session, project):
    previous_assets = session.query('Asset where name like "Test %" and context_id is "{}"'.format(project['id']))
    for asset in previous_assets:
        session.delete(asset)

    previous_folders = session.query('TypedContext where name is "Folder" and project_id is "{}"'.format(project['id']))
    for folder in previous_folders:
        session.delete(folder)

    session.commit()


def set_component_meta(component, width, height):
    component['metadata']['ftr_meta'] = json.dumps({
        'frameIn': 0,
        'frameOut': 150,
        'frameRate': 25,
        'width': width,
        'height': height,
    })


def main(session):
    logger.info('Creating or cleaning up project "{}"'.format(PROJECT_NAME))
    project = session.ensure('Project', {
        'name': PROJECT_NAME
    })
    clean_up(session, project)

    logger.info('Creating asset 1')
    asset_version = create_asset(session, project, 'Test 1 (Encoding)')
    component = upload_media(session, asset_version, MEDIA_720)
    component['metadata']['ftr_meta'] = 'encoding'
    session.commit()

    logger.info('Creating asset 2')
    asset_version = create_asset(session, project, 'Test 2 (Processing additional resolutions)')
    asset_version.create_thumbnail(THUMBNAIL_FILE)
    component_1 = upload_media(session, asset_version, MEDIA_720)
    set_component_meta(component_1, 1280, 720)

    component_2 = session.create('FileComponent', {
        'version_id': asset_version['id'],
        'name': 'ftrackreview-mp4-1080',
        'file_type': '.mp4',
    })
    component_2['metadata']['ftr_meta'] = 'encoding'
    session.commit()

    logger.info('Creating asset 3')
    asset_version = create_asset(session, project, 'Test 3 (Complete)')
    asset_version.create_thumbnail(THUMBNAIL_FILE)
    component_1 = upload_media(session, asset_version, MEDIA_720)
    set_component_meta(component_1, 1280, 720)

    component_2 = upload_media(session, asset_version, MEDIA_1080, 'ftrackreview-mp4-1080')
    set_component_meta(component_2, 1920, 1080)

    session.commit()

    logger.info('Creating asset 4')
    asset_version = create_asset(session, project, 'Test 4 (No components)')
    session.commit()

    logger.info('Creating asset 5')
    asset_version = create_asset(session, project, 'Test 5 (is_published = False)')
    asset_version['is_published'] = False
    component_1 = upload_media(session, asset_version, MEDIA_720)
    set_component_meta(component_1, 1280, 720)
    session.commit()

    logger.info('Creating asset 6')
    asset_type = session.query('AssetType where name is "Upload"').one()
    asset = session.create('Asset', {
        'name': 'Test 6 (No versions)',
        'type': asset_type,
        'parent': project
    })
    session.commit()

    logger.info('Creating asset 7')
    folder = session.create('Folder', { 'name': 'Folder', 'parent': project })
    subfolder = session.create('Folder', { 'name': 'Subfolder', 'parent': folder })
    asset_version = create_asset(session, subfolder, 'Test 7 (In subfolder)')
    asset_version.create_thumbnail(THUMBNAIL_FILE)
    component_1 = upload_media(session, asset_version, MEDIA_720)
    set_component_meta(component_1, 1280, 720)
    session.commit()

    if TEST_VIDEO_URL:
        logger.info('Creating asset 8 - ftrack.review')
        asset_version = create_asset(session, subfolder, 'Test 8 (ftrack.review location)')
        asset_version.create_thumbnail(THUMBNAIL_FILE)
        review_location = session.query('Location where name is "ftrack.review"').one()
        component_1 = asset_version.create_component(
            path=TEST_VIDEO_URL,
            data={'name': 'ftrackreview-mp4'},
            location=review_location
        )
        set_component_meta(component_1, 1280, 720)
        session.commit()
    else:
        logger.info('TEST_VIDEO_URL not set, skipping ftrack.review asset')

    logger.info('Completed successfully')


if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO)
    session = ftrack_api.Session(auto_connect_event_hub=True)
    main(session)

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.