Automate via Slicebot

Use Slicebot to monitor one or more directories for new files. Once a file is detected, it is automatically sliced and uploaded to the cloud.

📘

Slicebot is included with the Slicer installation and it is not officially supported on Windows.

Quick Start

Setting up Slicebot consists of the following steps:

  1. Create a configuration file that defines the directories to be monitored and how content will be processed.
  2. Start Slicebot by running the following command: ./slicebot /ConfigurationFilePath

Basic Information

This section explains:

Configuration

Configuration settings may be defined through the following mechanisms:

Settings will be applied in the following order:

  1. [Global] section of the main configuration file.
  2. Directory-specific sections in the main configuration file.
  3. File-specific configuration file.
  4. File name.

As a result, settings defined within a file name will take precedence over any conflicting settings defined elsewhere.

Main Configuration File

Slicebot requires a configuration file that contains settings defining:

  • How and when source media will be processed.
  • The directories that will be monitored for source media.

View configuration settings.

Key Information:

  • Upon starting Slicebot, it must be informed where this configuration file is located.
  • Create this configuration file using a text editor.
    • The file extension for this file should be "cfg" in lower-case (e.g., slicebot.cfg).
    • This configuration file may be saved in any directory that is accessible by Slicebot.

Categorize settings into the following sections:

  • Global: Defines a default configuration for all monitored directories.

  • Directory-specific Settings: A section must be created for each desired monitored directory.

    • The header for this type of section should be set to the full path to the desired directory.

      Example:

      [~/sales/videos/2016/]
  • The settings defined in this type of section:

    • Only apply to that directory.
    • Override any conflicting settings defined in the Global section.
  • A section may be left blank. A blank section indicates that the specified directory should be monitored and processed according to the configuration defined in:

    • The Global section of the main configuration file.
    • A file-specific configuration file.
    • A file-name.

Define settings using the following format: Name = Value

Sample Configuration

[global]
enc_wait = 1
mail_host = smtp.gmail.com:587
done_emails = [email protected], [email protected]
fail_emails = [email protected]
[~/t/slice/a/]
[~/t/slice/b/]
enc_wait = 0
username = [email protected]
apikey = abcDEFghiJKLmnoPQRtuvWXYz123ABCdefGHIJKL

File-Specific Configuration File

Instructions on when and how a specific file is processed may be defined by creating a configuration file that contains the desired configuration settings.

<Info>Although most configuration settings may be defined within a file-specific configuration, there are exceptions (e.g., halt_on_error and ignore). The description associated with each setting indicates any limitations on where it may be implemented.</Info>

Key information

  • File-specific settings may be defined in a text file that meets the following conditions:

    • It must be stored in the same directory as the desired source media.

    • It must be named after the desired source media file.

    • The file extension for this file should be "cfg" in lower-case (e.g., myvideo.mp4.cfg).

      <Info>Use the helper_noext setting to exclude the source media's file extension (e.g., mp4).</Info>

  • This type of configuration file should not contain section headers (e.g., [global] or [~/folder/]).

  • File-specific settings override conflicting settings defined in the main configuration file.

  • The recommended best practice is to ensure that a file-specific configuration file is present in a monitored directory before the corresponding media file is copied into it. This ensures that the media file will be processed according to the configuration defined in the file-specific configuration file.

  • Define the require_config setting within the main configuration file to require a file-specific configuration before processing a file.

A sample configuration file is provided below.

enc_wait = 0
done_emails = [email protected], [email protected]
fail_emails = [email protected]

File Name Configuration

Instructions on when and how a specific file is processed may be defined by including the desired settings within the source media's file name.

<Info>Slicebot will only honor settings defined within a file name when the allow_inline setting has been enabled via either the main or a file-specific configuration file.</Info>

<Info>Although most configuration settings may be defined within a file name, there are exceptions (e.g., halt_on_error and ignore). The description associated with each setting indicates any limitations on where it may be implemented.</Info>

Syntax: FileName^Setting1=Value1^Setting2=Value2^SettingN=ValueN.ext

Example

Original file name: marketing.mp4

New file name: marketing^max_slices=3^external_id=1FA1272b.mp4

Follow these guidelines when defining a setting within a file name:

  • Each setting should be appended to the file name.

  • Each setting should be prepended with a caret (^) symbol.

  • A file name should never contain spaces.

    • Convert space characters within a setting's value to the plus (+) symbol.

      Example: my_movie^description=Standard+Trailer.mp4

      In the above example, the asset's name will be set "Standard Trailer."

  • A matching file name must still be assigned to any supporting files (e.g., closed captioning or file-specific configuration file).

    Closed Captioning Example: my_movie^max_slices=3^external_id=1FA1272b.mp4.ttml

    <Info></Info>The helper_noext setting determines whether source media's file extension (e.g., mp4) needs to be included when naming supporting files.

  • Settings defined within a file name override conflicting settings defined in the Slicebot or a file-specific configuration file.

  • Avoid creating file names longer than those supported by the OS.

<Tip>Use file-specific configuration files to avoid OS limitations.</Tip>

Testing

Use --dry-run option to test your configuration without processing files.

./slicebot --dry-run slicebot.cfg

End a Slicebot Session

Slicebot runs indefinitely until one of the following conditions is true:

  • It is manually interrupted. The recommended method of interrupting Slicebot is through the SIGINT signal. This signal allows Slicebot to finish the current slicing job before shutting down. Pass this signal to Slicebot by running the following command: kill -SIGINT SlicebotPID
  • Slicebot encounters a fatal error causing it to exit with a non-zero code. This may occur when there is an issue with the configuration file.

Configuration Settings

This section describes the supported configuration settings that can be used to control how slicebot processes files.

Key information

  • The config file format considers lines starting with # to be comments, so they are ignored.

  • Although most settings can be used anywhere (global section, directory sections, or per-file configs), you will find that some settings are more naturally used in some places more than others. For example, the global section will typically hold things like username, API key, and email settings, although they are legal in other places as well.

  • Setting values support basic value substitution:

    [FILENAME] - replaced with the current source filename, minus the path. Example, with a source file of /mnt/files/ad.mp4:

    external_id=foo[FILENAME]bar
    would become
    external_id=fooad.mp4bar

    [FILENAME_SHORT] - replaced with the current source filename, minus the path and file extension. Example, with a source file of /mnt/files/ad.mp4:
    external_id=foo[FILENAME_SHORT]bar
    would become
    external_id=fooadbar

The following configuration settings may be leveraged when defining:

SettingDescriptionExample
allow_inlineDirectory Monitoring
Determines whether the source media's file name may contain configuration settings. Learn more.

Valid values are:
  • 1 | true: Indicates that the file name may contain configuration settings.
  • 0 | false: Indicates that settings defined within the file name will be ignored.
Default value: 1
allow_inline = 0
apikey (Required)Authorization
Sets the secret API key through which Slicebot authenticates to the CMS.

Note: Bypass this requirement by setting the SLICER_USER and SLICER_APIKEY environment variables.

This API key should correspond to the user defined by the username setting.

Find API keys via Settings > Integration Keys > API Keys on the Integration Keys page.

Syntax: apikey = APIKey
apikey = abcdefg...
auto_replaceAsset Replacement (Library)
Determines whether asset(s) with the same external ID will be automatically replaced.

Valid values are:
  • 1 | true: Ensures that the external ID assigned to an asset starts with _replace. This will cause it to replace existing assets with the same external ID.
  • 0 | false: Indicates that the external ID assigned to an asset will not be modified.
auto_replace = 1
autoexpireAsset Retention (Library)
Marks an asset for deletion once the specified number of hours have elapsed.

The sample configuration will delete assets 48 hours after they have been encoded.
autoexpire = 48
breaksBreaks (Asset)
Inserts ad breaks or boundary breaks at specified time ranges.

Syntax: -break <start>[-<stop>][,...]
  • Times are in decimal seconds
  • Multiple breaks separated by commas
  • Unlabeled breaks are ad breaks (original content removed)
  • Labeled breaks (label:<start>-<stop>) are boundary breaks (content preserved)
breaks=10.1-30.58,105-151.332 - Two ad breaks with content removed.
breaks=ad1:10.1-20,30.3-40,promo:60-70 - Two boundary breaks (ad1, promo) and one ad break (30.3-40).
bugAsset
Overlays an image on the video at the specified start time for the given duration.

Key information:
  • Only RGBA PNG images may be overlaid onto video.
  • The overlay respects the PNG's transparency.
  • The PNG image should match the source video's resolution.
  • Start time and duration are specified in milliseconds.
  • Use a negative start time to count from the end of the asset (e.g., -5000 starts 5 seconds before the end).
  • Specify multiple overlays by using three commas as a delimiter.
  • If multiple images overlap, Z-order is determined by their listed order (later entries are on top).
Syntax: bug = PNGFile,StartTime,Duration

The sample adds overlay1.png at the start for 5s and overlay2.png five seconds before the end; overlapping favors overlay2.png on top.
bug = overlay1.png,0,5000,,,overlay2.png,-5000,5000
descriptionAsset (Library)
Assigns a name to the asset generated from the source media. Typically used in file-specific configurations. By default, assets are named after the source media's file name.
description = Marketing Event 2016
done_directoryPost-Processing
Defines the directory to which the source media will be moved after it has been successfully processed.

Key information:
  • If the specified directory does not exist, it will be created.
  • After successful processing, the source media will be deleted if either:
    • This setting has not been defined, or
    • This setting is set to none.
Syntax: done_directory = none
done_directory = ~/media/success
done_emailsNotifications
Comma-separated list of email addresses to notify when a file is successfully processed. Requires mail_host.
done_emails = [email protected], [email protected]
done_urlNotifications
Defines the URL to which an HTTP POST request is submitted when a file is successfully processed. Learn more.
done_url = http://myserver.net/myservice
enc_waitSlicebot
Determines whether Slicebot waits for cloud encoding to finish before processing the next file.

Valid values are:
  • 1: Wait until encoding completes.
  • 0: Move on after slicing completes.
Default value: 0
enc_wait = 1
external_idAsset (Library)
Assigns an external ID to the generated asset. By default, duplicate external IDs are allowed. Prefix an ID with _replace: to replace existing assets with the same ID.
external_id = ep20115e_12
external_id = _replace:ep20115e_12
fadeAsset
Fades audio and/or video in/out from the specified start time.

Key information:
  • Method: in or out
  • MediaType: audio, video, or both
  • Start time and duration are in milliseconds.
  • Negative start times are from the end (e.g., -5000).
  • Specify multiple fades using three commas as a delimiter.
Syntax: fade = Method,MediaType,StartTime,Duration
fade = in,both,0,5000,,,out,both,-5000,5000
fail_directoryPost-Processing
Directory to move source media to when processing fails.

Key information:
  • If the directory does not exist, it will be created.
  • After all attempts fail, the source media will be deleted if either:
    • This setting has not been defined, or
    • This setting is set to none.
Syntax: fail_directory = none
fail_directory = ~/media/failure
fail_emailsNotifications
Comma-separated emails to notify when a file is unsuccessfully processed. Requires mail_host.
fail_emails = [email protected]
fail_urlNotifications
URL to which an HTTP POST is submitted when a file is unsuccessfully processed. Learn more.
fail_url = http://myserver.net/myservice2?status=fail
force_aspect_ratioAsset
Forces the video to the specified aspect ratio.

Syntax: force_aspect_ratio = WidthRatio:HeightRatio
force_aspect_ratio = 16:9
halt_on_errorSource Media Processing
Determines whether processing stops when an issue occurs. Only valid in the main configuration file.

Valid values are:
  • 1 | true: Stop when a job fails due to a source media or configuration issue.
  • 0 | false: Always continue to the next job.
Default value: 0
halt_on_error = 1
helper_noextDirectory Monitoring
Determines whether supporting files must exclude the source media's file extension.

Valid values are:
  • 1 | true: Supporting file name excludes the source media's extension.
  • 0 | false: Supporting file name includes the source media's extension.
Example (when 1 | true):
  • Source: marketing.mp4
  • Config: marketing.cfg
Example (when 0 | false):
  • Source: marketing.mp4
  • Config: marketing.mp4.cfg
helper_noext = 1
ignoreConfiguration File
Determines whether a directory will be monitored for new files. Define only under a directory-specific section in the main configuration file.

Valid values are:
  • 1 | true: Do not monitor this directory.
  • 0 | false: Monitor this directory.
ignore = 1
ignoreNameDirectory Monitoring
Ignore files in a monitored directory with the specified file name(s).

Key information:
  • File names are case-insensitive.
  • Specify multiple files with commas.
ignoreName = thumbs.db,.DS_Store
ignoreSuffixDirectory Monitoring
Ignore files in a monitored directory with the specified file extension(s).

Key information:
  • Extensions are case-insensitive.
  • Specify multiple extensions with commas.
ignoreSuffix = db,txt,jpg
librariesAsset (Library)
Adds an asset to one or more shared libraries.

Key information:
  • A library may be specified by name or GUID.
  • Library names must be an exact, case-sensitive match.
  • Add multiple libraries using commas.
Add by name: libraries = LibraryName
Add by GUID: libraries = LibraryGUID
Add multiple: libraries = Library1,Library2,LibraryN
libraries = 357...,8b0...
mail_fromNotifications
Sender email address for notifications.
mail_from = [email protected]
mail_hostNotifications
Hostname for the mail server used to send notifications. A port may be appended.
  • 25: Standard email
  • 587: Secure email
If the server requires auth, define mail_username and mail_password.

Syntax: mail_host = Hostname:Port
mail_host = smtp.company.com:587
mail_passwordNotifications
Password for the user defined by mail_username. Required only if the mail server requires auth.
mail_password = G183hIU39331f
mail_usernameNotifications
User account on the mail server used to send notifications. Required only if the mail server requires auth.
mail_username = [email protected]
max_slicesSlicing
Limits the number of temporal slices generated from the source media.

Key information:
  • By default, the entire file is sliced (no limit).
  • Useful for troubleshooting or slicing short segments.
  • This is an approximate limit; the Slicer may produce a few additional slices.
max_slices = 20
metaAsset (Library)
Adds metadata to the asset.

Key information:
  • Field names must be unique; use lowercase letters, digits, and underscores.
  • Enclose values containing spaces in quotes.
  • Assign multiple fields using three commas as a delimiter.
Syntax: meta = Field=Value

Alternatively, assign metadata via a JSON file. Learn more.
meta = rating=TV-13
meta = rating=TV-13,,,air_date=20160105
meta_intAsset (Library)
Adds integer metadata to the asset.

Key information:
  • Field names must be unique (case-insensitive).
  • Non-integer values are coerced to 0.
  • Assign multiple fields using three commas as a delimiter.
Syntax: meta_int = Field=Integer
meta_int = is_ad=1
meta_int = is_ad=1,,,year=2013
mix_atracksAsset
Mixes multiple audio tracks into a single track (e.g., when left/right are on separate tracks).

Key information:
  • Track index is zero-based (0 is the first audio track).
  • Channels: L, R, C, RL, RR, SL, SR, LFE.
  • Use commas between track mappings.
Syntax: mix_atracks = Track1=Channel1,Track2=Channel2,...
mix_atracks = 0=L,1=R,2=C,3=RL,4=RR,5=LFE
multibotDirectory Monitoring
Indicates whether multiple Slicebot instances monitor the same directory.

Valid values are:
  • 0: Only a single instance monitors any given directory.
  • 1: More than one instance monitors the directory.
All Slicebot instances consuming from the same folder must enable multibot mode. Each instance should run on a separate computer.

Default value: 1
multibot = 1
notify_retriesNotifications
Maximum attempts to send an HTTP notification before proceeding to the next file. Applies to start_url, done_url, and fail_url.

Default value: 3
notify_retries = 10
notify_retry_waitNotifications
Seconds to wait after a failed notification before retrying.

Default value: 10
notify_retry_wait = 30
posterAsset
Generates a poster image from the frame at the specified time. Must be used with poster_size. Ignored when poster_file is defined.

Syntax: poster = Time
poster = 5000
poster_fileAsset
Sets the asset's poster image to the specified file.

Syntax: poster_file = FullPath
poster_file = /images/poster.png
poster_sizeAsset
Sets the size of the poster image.

Key information:
  • Must be used with the poster time parameter.
  • Ignored when poster_file is defined.
  • If neither poster nor poster_file is defined, a thumbnail of on-demand content is used.
  • No upscaling beyond source resolution.
  • Poster images are scaled down preserving aspect ratio.
Syntax: poster_size = WidthxHeight
poster_size = 512x512
require_captionsProcessing Prerequisite
Determines whether a closed captioning file is required. Learn more.

Valid values are:
  • 1 | true: Do not process unless corresponding captions are found.
  • 0 | false: Process regardless of captions.
require_captions = 1
require_configProcessing Prerequisite
Determines whether a file-specific configuration file is required. (Invalid inside file-specific configuration files.)

Valid values are:
  • 1 | true: Require a corresponding file-specific configuration file.
  • 0 | false: Process regardless of a file-specific configuration file.
require_config = 1
skip_drmAsset
Determines whether the asset's playback URLs must be signed.

Valid values are:
  • 1: Encrypt the asset but allow unsigned playback URLs (useful for ads that require independent playback).
  • 0: Playback requires a signed playback URL.
skip_drm = 1
start_urlURL to which an HTTP POST request is submitted whenever slicing is initiated. Learn more.start_url = http://myserver.net/myservice
thumbnailsAsset
Adds one or more thumbnails.

Key information:
  • A default thumbnail is created even if not specified.
  • The file name for each thumbnail is prefixed as specified.
  • Each thumbnail is bounded by the specified width and height, preserving aspect ratio.
  • Additional thumbnails may add cost and impact processing speed.
  • Add multiple thumbnails using commas.
Syntax: thumbnails = Prefix:WidthxHeight,Prefix2:Width2xHeight2,...
thumbnails = tiny:50x50,med:400x400
timedmetaAsset
Adds timed metadata at the specified time.

Single Field Syntax: timedmeta = Time:Field=Value
Multiple Fields Syntax: timedmeta = Time1:Field1=Value1,Time2:Field2=Value2,...
timedmeta = 0:TIT2=MyTitle,2000:TCOM=Myself
trimAsset
Trims content prior to the specified start time; optionally trims by duration.

Specify StartTime and Duration in milliseconds. Some file types may affect frame accuracy by a few milliseconds.

Start only: trim = StartTime
Start and duration: trim = StartTime,Duration
trim = 3000,52500
username (Required)Authorization
Identifier used for authentication for the account to which the asset will be uploaded. You may specify either a workspace ID (formerly known as owner ID) or a user name (typically the email address associated with your account). Using a workspace ID is recommended because it is immutable, whereas user names and email addresses may change over time. You can bypass by setting SLICER_USER and SLICER_APIKEY environment variables.
username = a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
username = [email protected]

Closed Captions

You can provide slicebot with closed caption information by placing closed caption data in a TTML file in the same directory as the media file. TTML files are simple text files that can be created with third party tools or with any text editor:

<?xml version="1.0" encoding="utf-8"?>
<tt xml:lang="en" xmlns="http://www.w3.org/2006/04/ttaf1" xmlns:tts="http://www.w3.org/2006/04/ttaf1#styling">
  <head>
    <styling>
      <style id="defaultSpeaker" tts:fontSize="24" tts:fontFamily="Arial" tts:fontWeight="normal" tts:fontStyle="normal" tts:textDecoration="none" tts:color="white" tts:backgroundColor="black" tts:textAlign="center" />
      <style id="defaultCaption" tts:fontSize="24" tts:fontFamily="Arial" tts:fontWeight="normal" tts:fontStyle="normal" tts:textDecoration="none" tts:color="white" tts:backgroundColor="black" tts:textAlign="center" />
    </styling>
  </head>
  <body style="defaultCaption" id="thebody">
    <div xml:lang="en">
      <p begin="00:00:01.420" end="00:00:02.620"><metadata ccrow="14" cccol="3" /><span tts:fontStyle="italic">THIS IS SOME TEXT...</span></p>
      <p begin="00:00:06.620" end="00:00:09.790"><metadata ccrow="13" cccol="1" />(Doorbell rings)</p>
      <p begin="00:00:11.100" end="00:00:13.000"><metadata ccrow="14" cccol="8" />♪ LA LA LA SINGING ♪</p>
      <p begin="00:00:20.460" end="00:00:22.170"><metadata ccrow="14" cccol="0" />THIS IS MORE TEXT</p>
    </div>
  </body>
</tt>

<Info>The require_captions config setting can be used to ensure that slicebot will skip a file if it does not have a corresponding TTML file. As with other settings, it can be used in the global, directory, or per-file context.</Info>

The TTML files use a naming convention similar to config files: take the name of the associated media file and add a ".ttml" extension to the filename. For example, if slicebot is processing a file named /tmp/foo/film.mp4, it will look to see if there is a file named /tmp/foo/film.mp4.ttml and, if so, use it for the source of closed caption data. If no corresponding TTML file exists, the video will not have any closed caption data. Note that the helper_noext setting can alter the naming convention for TTML files.

<Info>Only hh:mm:ss.sss time formats are currently supported in the TTML file.</Info>

Metadata Files

You can assign metadata key-value pairs to an asset using individual settings; for larger amounts of metadata, however, this can be cumbersome, so it may be more convenient to make use of a metadata file. This file is a JSON text file that has the metadata you want associated with the media file. As with caption and config files, the name of the metadata file is the media filename with an additional extension: .meta.json. For example, if a media file is named video123.mp4, then an associated metadata file for it would be named video123.mp4.meta.json.

The contents of the metadata file must be a valid JSON object, or processing the file will produce an error. Structured metadata is supported, although presently it is not fully displayed or editable in the CMS UI.

{
    "genre" : "comedy",
    "network" : "ZNN",
    "season" : 1,
    "episode" : 13
}

In general, a given media file will use individual metadata settings or a metadata file, but not both. However, in the event that both are specified for a particular file, metadata from a file is applied first, followed by any metadata settings.

HTTP Notifications

HTTP notifications provide an additional way to integrate a system with your content production workflow. This type of notification allows Slicebot to submit a HTTP POST request whenever one of the following events takes place:

  • Slicing Starts (start_url)
  • Slicing Completes (done_url)
  • Slicing Error (fail_url)

<Tip>Enable HTTP notifications by setting one or more of the above settings to the URL that will be requested.</Tip>

Email notifications may also be sent whenever slicing completes (done_emails) or when an error occurs (fail_emails).

HTTP POST Request

Slicebot will submit a HTTP POST request using the default Internet media type (i.e., application/x-www-form-urlencoded). The body of this request will consist of a single line with the following parameters:

ParameterDescription
filenameIndicates the full path and the filename of the file.
asset_idIndicates the system-generated unique ID of the new asset.
external_idIndicates the external ID defined in the configuration. If one has not been defined, then it will be set to an empty string.
descriptionIndicates the file's description defined in the configuration. If one has not been defined, then it will be set to an empty string.
statusIndicates the result of the slicing operation. Valid values are either "ok" or "error."

In addition to the above parameters, any custom query string parameters defined in the configuration setting (i.e., start_url, done_url, and fail_url) will be automatically stripped from the request and inserted into the request body. This allows custom parameters to be passed to the remote server as needed.

View a sample scenario.

<Info>Custom query string parameters whose names match one of the above system-defined parameters (e.g., filename or description) will be ignored.</Info>

<Info>To allow for future expansion, the server process that receives the HTTP POST should silently ignore unrecognized parameters.</Info>

Notification Issues

Slicebot will log an error under the following conditions:

  • It has been configured to request an invalid URL.
  • A valid URL has been provided, but the server is unreachable.
  • A valid URL has been provided, but it generates a non-200 response.

After which, it will reattempt the HTTP notification several times as determined by the notify_retries setting. After each attempt, it will pause for a few seconds as determined by the notify_retry_wait setting. If it is unable to successfully submit the HTTP POST request, then it will move on to the next file.

Sample HTTP Notification Scenario

This sample HTTP notification scenario assumes that the done_url setting is configured to:

http://www.example.com/slicing/handler?custom=1234&other=5678

The following sample HTTP POST request will be submitted once a file called "video.m4v" has been successfully sliced.

POST /slicing/handler HTTP/1.1
Host: www.example.com
Accept-Encoding: identity
Content-Length: 161
Content-Type: application/x-www-form-urlencoded
Connection: close
User-Agent: upLynk-slicebot/1.0
status=ok&other=5678&description=The%20file&filename=%2Fopt%2Ft%2Fmyvideos%2Fvideo.m4v&external_id=dummy_id&custom=1234&asset_id=a9119d7afc5242319d028794ae283ea7

Notice that the custom query string parameters (i.e., custom and other) defined in the done_url setting were automatically stripped from the request and inserted into the request body.<Info