Skip to content

Commit

Permalink
Merge pull request #22 from iluvcapra/feat-builders
Browse files Browse the repository at this point in the history
Feature: builders
  • Loading branch information
iluvcapra authored Jul 20, 2023
2 parents 6b83f15 + 2233749 commit f4f5392
Show file tree
Hide file tree
Showing 10 changed files with 625 additions and 252 deletions.
18 changes: 13 additions & 5 deletions examples/make_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,19 @@
import sys
import ptsl


if len(sys.argv) < 3:
print(f"Usage: {sys.argv[0]} <path> <session-name>")
sys.exit(-1)
import os.path

with ptsl.open_engine(company_name="py-ptsl",
application_name=sys.argv[0]) as e:
e.create_session(name=sys.argv[2], path=sys.argv[1])
print("Creating new session:")
path = input("Session path: ")
name = input("Session name: ")
builder = e.create_session(name=name, path=os.path.expanduser(path))
builder.sample_rate(int(input("Sample rate: ")))
builder.bit_depth(int(input("Bit Depth: ")))
if input("WAVE or AIFF? ").startswith(("A", "a")):
builder.aiff_format()
else:
builder.wave_format()

builder.create()
2 changes: 1 addition & 1 deletion ptsl/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,4 @@
from .engine import Engine, open_engine
from .errors import CommandError

__version__ = '100.3.0'
__version__ = '101.0.0'
128 changes: 128 additions & 0 deletions ptsl/builders/create_session_builder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
from ptsl.PTSL_pb2 import SAF_AIFF, SAF_WAVE,\
SR_48000, Bit16, Bit24, Bit32Float, \
IO_Last, IO_StereoMix, IO_51SMPTEMix

import ptsl
from ptsl import ops, util


class CreateSessionBuilder:
def __init__(self, engine: 'ptsl.Engine', name: str, path: str):
self._engine = engine
self._session_name = name
self._path = path
self._audio_format = SAF_WAVE
self._sample_rate = SR_48000
self._bit_depth = Bit24
self._io_settings = IO_Last
self._is_interleaved = False

def audio_format(self, value: str):
"""
:param value: Audio format for the new session. Acceptable
values are "wave" or "aiff".
"""
if value == 'wave':
self._audio_format = SAF_WAVE
elif value == 'aiff':
self._audio_format = SAF_AIFF
else:
assert False, f"Invalid audio_format value {value}"

def wave_format(self):
self.audio_format("wave")

def aiff_format(self):
self.audio_format("aiff")

def sample_rate(self, value: int):
self._sample_rate = util.sample_rate_enum(value)

def bit_depth(self, value: int):
"""
:param value: Bit depth for the new session. Acceptable
values are `16`, `24` or `32`.
"""
if value == 16:
self._bit_depth = Bit16
elif value == 24:
self._bit_depth = Bit24
elif value == 32:
self._bit_depth = Bit32Float
else:
assert False, f"Invalid bit_depth value {value}"

def stereo_io_settings(self):
self._io_settings = IO_StereoMix

def smpte51_io_settings(self):
self._io_settings = IO_51SMPTEMix

def interlaved(self, value: bool):
self._is_interleaved = value

def create(self) -> None:
op = ops.CreateSession(
session_name=self._session_name,
file_type=self._audio_format,
sample_rate=self._sample_rate,
input_output_settings=self._io_settings,
is_interleaved=self._is_interleaved,
session_location=self._path,
bit_depth=self._bit_depth,
)

self._engine.client.run(op)


class CreateSessionFromTemplateBuilder(CreateSessionBuilder):

def __init__(self, engine: 'ptsl.Engine',
template_name: str,
template_group: str,
name: str,
path: str):
self._template_name = template_name
self._template_group = template_group
super().__init__(engine, name, path)

def create(self):
op = ops.CreateSession(
session_name=self._session_name,
create_from_template=True,
template_group=self._template_group,
template_name=self._template_name,
file_type=self._audio_format,
sample_rate=self._sample_rate,
input_output_settings=self._io_settings,
is_interleaved=self._is_interleaved,
session_location=self._path,
bit_depth=self._bit_depth
)

self._engine.client.run(op)


class CreateSessionFromAAFBuilder(CreateSessionBuilder):

def __init__(self, engine: 'ptsl.Engine',
aaf_path: str,
name: str,
path: str):
self._aaf_path = aaf_path
super().__init__(engine, name, path)

def create(self):
op = ops.CreateSession(
session_name=self._session_name,
file_type=self._audio_format,
sample_rate=self._sample_rate,
input_output_settings=self._io_settings,
is_interleaved=self._is_interleaved,
session_location=self._path,
bit_depth=self._bit_depth,
create_from_aaf=True,
path_to_aaf=self._aaf_path
)

self._engine.client.run(op)
123 changes: 123 additions & 0 deletions ptsl/builders/export_text_builder.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
from ptsl.PTSL_pb2 import DontShowCrossfades, ShowCrossfades, \
CombineCrossfadedClips, BarsBeats, MinSecs, TimeCode, \
FeetFrames, Samples, UTF8, TextEdit, ESI_String, ESI_File, \
AllTracks, SelectedTracksOnly

import ptsl
from ptsl import ops


class ExportSessionTextBuilder:

def __init__(self, engine: 'ptsl.Engine'):
self._engine = engine
self._include_clip_list = False
self._include_file_list = False
self._include_markers = False
self._include_plugin_list = False
self._include_track_edls = False
self._show_sub_frames = False
self._track_list_type = None
self._include_user_timestamps = False
self._fade_handling_type = DontShowCrossfades
self._track_offset_options = TimeCode
self._encoding = UTF8
self._output_type = ESI_String
self._output_path = None

def include_clip_list(self):
self._include_clip_list = True

def include_file_list(self):
self._include_file_list = True

def include_markers(self):
self._include_markers = True

def include_plugin_list(self):
self._include_plugin_list = True

def include_track_edls(self):
self._include_track_edls = True
self._track_list_type = AllTracks

def show_sub_frames(self):
self._show_sub_frames = True

def all_tracks(self):
self._track_list_type = AllTracks

def selected_tracks_only(self):
self._track_list_type = SelectedTracksOnly

def dont_show_crossfades(self):
self._fade_handling_type = DontShowCrossfades

def show_crossfades(self):
self._fade_handling_type = ShowCrossfades

def combine_crossfaded_clips(self):
self._fade_handling_type = CombineCrossfadedClips

def time_type(self, value: str):
"""
Set the time type.
:param value: A string indicating the time format. Can
be "tc", "timecode", "bars+beats", "min:sec",
"feet+frames". Any otrher value will set the time
type to Samples.
"""
if value in ["tc", "timecode"]:
self._track_offset_options = TimeCode
elif value == "bars+beats":
self._track_offset_options = BarsBeats
elif value == "min:sec":
self._track_offset_options = MinSecs
elif value == "feet+frames":
self._track_offset_options = FeetFrames
else:
self._track_offset_options = Samples

def utf8_encoding(self):
self._encoding = UTF8

def textedit_encoding(self):
self._encoding = TextEdit

def export_file(self, path: str) -> None:
op = ops.ExportSessionInfoAsText(
include_clip_list=self._include_clip_list,
include_file_list=self._include_file_list,
include_markers=self._include_markers,
include_plugin_list=self._include_plugin_list,
include_track_edls=self._include_track_edls,
show_sub_frames=self._show_sub_frames,
track_list_type=self._track_list_type,
include_user_timestamps=self._include_user_timestamps,
fade_handling_type=self._fade_handling_type,
track_offset_options=self._track_offset_options,
text_as_file_format=self._encoding,
output_type=ESI_File,
output_path=path)

self._engine.client.run(op)

def export_string(self) -> str:
op = ops.ExportSessionInfoAsText(
include_clip_list=self._include_clip_list,
include_file_list=self._include_file_list,
include_markers=self._include_markers,
include_plugin_list=self._include_plugin_list,
include_track_edls=self._include_track_edls,
show_sub_frames=self._show_sub_frames,
track_list_type=self._track_list_type,
include_user_timestamps=self._include_user_timestamps,
fade_handling_type=self._fade_handling_type,
track_offset_options=self._track_offset_options,
text_as_file_format=self._encoding,
output_type=ESI_String,
output_path=None)

self._engine.client.run(op)
return op.response.session_info
Loading

0 comments on commit f4f5392

Please sign in to comment.