mirror of
https://github.com/iluvcapra/ptulsconv.git
synced 2025-12-31 17:00:46 +00:00
Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
17f17d592a | ||
|
|
b41d92b842 | ||
|
|
dc11a40530 | ||
|
|
b80e593350 | ||
|
|
961d68df21 | ||
|
|
80729443d1 | ||
|
|
c1671f3656 | ||
|
|
6c76827f42 | ||
|
|
1228e2adbe | ||
|
|
88d9aef92a | ||
|
|
e5f94bb506 | ||
|
|
539cae15b7 | ||
|
|
ee407e9e62 | ||
|
|
591d966e64 | ||
|
|
6f2ec325cf | ||
|
|
ed2a916673 | ||
|
|
926072ae3c | ||
|
|
a06b8c8aaa | ||
|
|
7cd86332e8 | ||
|
|
02a96d7143 | ||
|
|
9043d28a21 | ||
|
|
81cdca5452 | ||
|
|
68969e77e2 | ||
|
|
d0da79b31b | ||
|
|
ccf6e65210 |
40
.github/workflows/python-package.yml
vendored
Normal file
40
.github/workflows/python-package.yml
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
|
||||||
|
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
|
||||||
|
|
||||||
|
name: Lint and Test
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
python-version: [3.7, 3.8, 3.9, "3.10"]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Set up Python ${{ matrix.python-version }}
|
||||||
|
uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: ${{ matrix.python-version }}
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
python -m pip install --upgrade pip
|
||||||
|
python -m pip install flake8 pytest
|
||||||
|
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
||||||
|
- name: Lint with flake8
|
||||||
|
run: |
|
||||||
|
# stop the build if there are Python syntax errors or undefined names
|
||||||
|
flake8 ptulsconv tests --count --select=E9,F63,F7,F82 --show-source --statistics
|
||||||
|
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
|
||||||
|
flake8 ptulsconv tests --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
|
||||||
|
- name: Test with pytest
|
||||||
|
run: |
|
||||||
|
PYTHONPATH=. pytest
|
||||||
4
.idea/.gitignore
generated
vendored
4
.idea/.gitignore
generated
vendored
@@ -1,4 +0,0 @@
|
|||||||
|
|
||||||
# Default ignored files
|
|
||||||
/workspace.xml
|
|
||||||
/tasks.xml
|
|
||||||
19
.idea/dictionaries/jamie.xml
generated
19
.idea/dictionaries/jamie.xml
generated
@@ -1,19 +0,0 @@
|
|||||||
<component name="ProjectDictionaryState">
|
|
||||||
<dictionary name="jamie">
|
|
||||||
<words>
|
|
||||||
<w>adlib</w>
|
|
||||||
<w>bottompadding</w>
|
|
||||||
<w>fmpxml</w>
|
|
||||||
<w>futura</w>
|
|
||||||
<w>leftpadding</w>
|
|
||||||
<w>lineafter</w>
|
|
||||||
<w>linebefore</w>
|
|
||||||
<w>ptulsconv</w>
|
|
||||||
<w>retval</w>
|
|
||||||
<w>smpte</w>
|
|
||||||
<w>subheader</w>
|
|
||||||
<w>timecode</w>
|
|
||||||
<w>timespan</w>
|
|
||||||
</words>
|
|
||||||
</dictionary>
|
|
||||||
</component>
|
|
||||||
9
.idea/dictionaries/jamiehardt.xml
generated
9
.idea/dictionaries/jamiehardt.xml
generated
@@ -1,9 +0,0 @@
|
|||||||
<component name="ProjectDictionaryState">
|
|
||||||
<dictionary name="jamiehardt">
|
|
||||||
<words>
|
|
||||||
<w>fmpxmlresult</w>
|
|
||||||
<w>frac</w>
|
|
||||||
<w>mins</w>
|
|
||||||
</words>
|
|
||||||
</dictionary>
|
|
||||||
</component>
|
|
||||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
6
.idea/inspectionProfiles/profiles_settings.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<component name="InspectionProjectProfileManager">
|
|
||||||
<settings>
|
|
||||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
|
||||||
<version value="1.0" />
|
|
||||||
</settings>
|
|
||||||
</component>
|
|
||||||
10
.idea/misc.xml
generated
10
.idea/misc.xml
generated
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (ptulsconv)" project-jdk-type="Python SDK" />
|
|
||||||
<component name="PyPackaging">
|
|
||||||
<option name="earlyReleasesAsUpgrades" value="true" />
|
|
||||||
</component>
|
|
||||||
<component name="PythonCompatibilityInspectionAdvertiser">
|
|
||||||
<option name="version" value="3" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
8
.idea/modules.xml
generated
8
.idea/modules.xml
generated
@@ -1,8 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ProjectModuleManager">
|
|
||||||
<modules>
|
|
||||||
<module fileurl="file://$PROJECT_DIR$/.idea/ptulsconv.iml" filepath="$PROJECT_DIR$/.idea/ptulsconv.iml" />
|
|
||||||
</modules>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
10
.idea/ptulsconv.iml
generated
10
.idea/ptulsconv.iml
generated
@@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<module type="PYTHON_MODULE" version="4">
|
|
||||||
<component name="NewModuleRootManager">
|
|
||||||
<content url="file://$MODULE_DIR$">
|
|
||||||
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
|
||||||
</content>
|
|
||||||
<orderEntry type="jdk" jdkName="Python 3.8 (ptulsconv)" jdkType="Python SDK" />
|
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
|
||||||
</component>
|
|
||||||
</module>
|
|
||||||
Binary file not shown.
6
.idea/vcs.xml
generated
6
.idea/vcs.xml
generated
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
language: python
|
|
||||||
python:
|
|
||||||
- "3.7"
|
|
||||||
- "3.8
|
|
||||||
script:
|
|
||||||
- "python -m unittest discover tests"
|
|
||||||
install:
|
|
||||||
- "pip install setuptools"
|
|
||||||
- "pip install parsimonious tqdm"
|
|
||||||
134
README.md
134
README.md
@@ -1,97 +1,55 @@
|
|||||||
[](https://travis-ci.com/iluvcapra/ptulsconv)
|

|
||||||
  [](https://pypi.org/project/ptulsconv/) 
|

|
||||||
|
[][pypi]
|
||||||

|

|
||||||
|
|
||||||
|
[pypi]: https://pypi.org/project/ptulsconv/
|
||||||
|
|
||||||
|
|
||||||
# ptulsconv
|
# ptulsconv
|
||||||
Read Pro Tools text exports and generate JSON, PDF reports.
|
|
||||||
|
|
||||||
## Notice!
|
Read Pro Tools text exports and generate PDF reports, JSON output.
|
||||||
|
|
||||||
At this time there are a lot of changes in the HEAD of this package and you should use the last posted Pypi package.
|
|
||||||
New features and much better reporting, including native PDF reports, are coming soon!
|
|
||||||
|
|
||||||
|
|
||||||
|
## Theory of Operation
|
||||||
|
|
||||||
|
[Avid Pro Tools][avp] can be used to make spotting notes for ADR recording
|
||||||
|
sessions by creating spotting regions with descriptive text and exporting the
|
||||||
|
session as text. This file can then be dropped into Excel or any CSV-reading
|
||||||
|
app like Filemaker Pro.
|
||||||
|
|
||||||
|
**ptulsconv** accepts a text export from Pro Tools and automatically creates
|
||||||
|
PDF and CSV documents for use in ADR spotting, recording, editing and
|
||||||
|
reporting, and supplemental JSON documents can be output for use with other
|
||||||
|
workflows.
|
||||||
|
|
||||||
|
### Reports Generated by ptulsconv by Default
|
||||||
|
|
||||||
|
1. "ADR Report" lists every line in an export with most useful fields, sorted
|
||||||
|
by time.
|
||||||
|
2. "Continuity" lists every scene sorted by time.
|
||||||
|
3. "Line Count" lists a count of every line, collated by reel number and by
|
||||||
|
effort/TV/optional line designation.
|
||||||
|
4. "CSV" is a folder of files of all lines collated by character and reel
|
||||||
|
as CSV files, for use by studio cueing workflows.
|
||||||
|
5. "Director Logs" is a folder of PDFs formatted like the "ADR Report" except
|
||||||
|
collated by character.
|
||||||
|
6. "Supervisor Logs" creates a PDF report for every character, with one line
|
||||||
|
per page, optimized for note-taking.
|
||||||
|
7. "Talent Scripts" is a minimal PDF layout of just timecode and line prompt,
|
||||||
|
collated by character.
|
||||||
|
|
||||||
|
|
||||||
|
[avp]: http://www.avid.com/pro-tools
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
The easiest way to install on your site is to use `pip`:
|
The easiest way to install on your site is to use `pip`:
|
||||||
|
|
||||||
% pip3 install ptulsconv
|
% pip3 install ptulsconv
|
||||||
|
|
||||||
This will install the necessary libraries on your host and gives you command-line access to the tool through an
|
This will install the necessary libraries on your host and gives you
|
||||||
entry-point `ptulsconv`. In a terminal window type `ptulsconv -h` for a list of available options.
|
command-line access to the tool through an entry-point `ptulsconv`. In a
|
||||||
|
terminal window type `ptulsconv -h` for a list of available options.
|
||||||
## Theory of Operation
|
|
||||||
|
|
||||||
[Avid Pro Tools][avp] exports a tab-delimited text file organized in multiple parts with an uneven syntax that usually
|
|
||||||
can't "drop in" to other tools like Excel or Filemaker. This tool accepts a text export from Pro Tools and produces an
|
|
||||||
XML file in the `FMPXMLRESULT` schema which Filemaker Pro can import directly into a new table.
|
|
||||||
|
|
||||||
In the default mode, all of the clips are parsed and converted into a flat list of events, one Filemaker Pro row per
|
|
||||||
clip with a start and finish time, track name, session name, etc. Timecodes are parsed and converted into frame counts
|
|
||||||
and seconds. Text is then parsed for descriptive meta-tags and these are assigned to columns in the output list.
|
|
||||||
|
|
||||||
[avp]: http://www.avid.com/pro-tools
|
|
||||||
|
|
||||||
### Fields in Clip Names
|
|
||||||
|
|
||||||
Track names, track comments, and clip names can also contain meta-tags, or "fields," to add additional columns to the
|
|
||||||
output. Thus, if a clip has the name:
|
|
||||||
|
|
||||||
`Fireworks explosion {note=Replace for final} $V=1 [FX] [DESIGN]`
|
|
||||||
|
|
||||||
The row output for this clip will contain columns for the values:
|
|
||||||
|
|
||||||
|...| PT.Clip.Name| note | V | FX | DESIGN | ...|
|
|
||||||
|---|------------|------|---|----|--------|----|
|
|
||||||
|...| Fireworks explosion| Replace for final | 1 | FX | DESIGN | ... |
|
|
||||||
|
|
||||||
These fields can be defined in the clip name in three ways:
|
|
||||||
* `$NAME=VALUE` creates a field named `NAME` with a one-word value `VALUE`.
|
|
||||||
* `{NAME=VALUE}` creates a field named `NAME` with the value `VALUE`. `VALUE` in this case may contain spaces or any
|
|
||||||
character up to the closing bracket.
|
|
||||||
* `[NAME]` creates a field named `NAME` with a value `NAME`. This can be used to create a boolean-valued field; in the
|
|
||||||
output, clips with the field will have it, and clips without will have the column with an empty value.
|
|
||||||
|
|
||||||
For example, if two clips are named:
|
|
||||||
|
|
||||||
`"Squad fifty-one, what is your status?" [FUTZ] {Ch=Dispatcher} [ADR]`
|
|
||||||
|
|
||||||
`"We are ten-eight at Rampart Hospital." {Ch=Gage} [ADR]`
|
|
||||||
|
|
||||||
The output will contain the range:
|
|
||||||
|
|
||||||
|...| PT.Clip.Name| Ch | FUTZ | ADR | ...|
|
|
||||||
|---|------------|------|---|----|-----|
|
|
||||||
|...| "Squad fifty-one, what is your status?"| Dispatcher | FUTZ | ADR | ... |
|
|
||||||
|...| "We are ten-eight at Rampart Hospital."| Gage | | ADR | ... |
|
|
||||||
|
|
||||||
|
|
||||||
### Fields in Track Names and Markers
|
|
||||||
|
|
||||||
Fields set in track names, and in track comments, will be applied to each clip on that track. If a track comment
|
|
||||||
contains the text `{Dept=Foley}` for example, every clip on that track will have a "Foley" value in a "Dept" column.
|
|
||||||
|
|
||||||
Likewise, fields set on the session name will apply to all clips in the session.
|
|
||||||
|
|
||||||
Fields set in markers, and in marker comments, will be applied to all clips whose finish is *after* that marker. Fields
|
|
||||||
in markers are applied cumulatively from breakfast to dinner in the session. The latest marker applying to a clip has
|
|
||||||
precedence, so if one marker comes after the other, but both define a field, the value in the later marker
|
|
||||||
|
|
||||||
An important note here is that, always, fields set on the clip name have the highest precedence. If a field is set in a clip
|
|
||||||
name, the same field set on the track, the value set on the clip will prevail.
|
|
||||||
|
|
||||||
### Using `@` to Apply Fields to a Span of Clips
|
|
||||||
|
|
||||||
A clip name beginning with "@" will not be included in the CSV output, but its fields will be applied to clips within
|
|
||||||
its time range on lower tracks.
|
|
||||||
|
|
||||||
If track 1 has a clip named `@ {Sc=1- The House}`, any clips beginning within that range on lower tracks will have a
|
|
||||||
field `Sc` with that value.
|
|
||||||
|
|
||||||
### Using `&` to Combine Clips
|
|
||||||
|
|
||||||
A clip name beginning with "&" will have its parsed clip name appended to the preceding cue, and the fields of following
|
|
||||||
cues will be applied (later clips having precedence). The clips need not be touching, and the clips will be combined
|
|
||||||
into a single row of the output. The start time of the first clip will become the start time of the row, and the finish
|
|
||||||
time of the last clip will become the finish time of the row.
|
|
||||||
|
|
||||||
@@ -1,38 +1,18 @@
|
|||||||
.\" Manpage for ptulsconv
|
.\" Manpage for ptulsconv
|
||||||
.\" Contact https://github.com/iluvcapra/ptulsconv
|
.\" Contact https://github.com/iluvcapra/ptulsconv
|
||||||
.TH ptulsconv 1 "15 May 2020" "0.4.0" "ptulsconv man page"
|
.TH ptulsconv 1 "15 May 2020" "0.8.2" "ptulsconv man page"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
.BR "ptulsconv" " \- convert
|
.BR "ptulsconv" " \- convert
|
||||||
.IR "Avid Pro Tools" " text exports"
|
.IR "Avid Pro Tools" " text exports"
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
ptulsconv [OPTIONS] Export.txt
|
ptulsconv [OPTIONS] Export.txt
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
Convert a Pro Tools text export into a flat list of clip names with timecodes. A tagging
|
Convert a Pro Tools text export into ADR reports.
|
||||||
language is interpreted to add columns and type the data. The default output format is
|
|
||||||
an XML file for import into Filemaker Pro.
|
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.IP "-h, --help"
|
.IP "-h, --help"
|
||||||
show a help message and exit.
|
show a help message and exit.
|
||||||
.TP
|
|
||||||
.RI "-i " "TC"
|
|
||||||
Drop events before this timecode.
|
|
||||||
.TP
|
|
||||||
.RI "-o " "TC"
|
|
||||||
Drop events after this timecode.
|
|
||||||
.TP
|
|
||||||
.RI "-m "
|
|
||||||
Include muted clips.
|
|
||||||
.TP
|
|
||||||
.RI "--json "
|
|
||||||
Output a JSON document instead of XML. (--xform will have no effect.)
|
|
||||||
.TP
|
|
||||||
.RI "--xform " "NAME"
|
|
||||||
Convert the output with a built-in output transform.
|
|
||||||
.TP
|
.TP
|
||||||
.RI "--show-available-tags"
|
.RI "--show-available-tags"
|
||||||
Print a list of tags that are interpreted and exit.
|
Print a list of tags that are interpreted and exit.
|
||||||
.TP
|
|
||||||
.RI "--show-available-transforms"
|
|
||||||
Print a list of built-in output transforms and exit.
|
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
Jamie Hardt (contact at https://github.com/iluvcapra/ptulsconv)
|
Jamie Hardt (contact at https://github.com/iluvcapra/ptulsconv)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
from ptulsconv.docparser.ptuls_grammar import protools_text_export_grammar
|
from ptulsconv.docparser.ptuls_grammar import protools_text_export_grammar
|
||||||
|
|
||||||
__version__ = '0.8.0'
|
__version__ = '0.8.3'
|
||||||
__author__ = 'Jamie Hardt'
|
__author__ = 'Jamie Hardt'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
|
|||||||
@@ -71,14 +71,19 @@ def make_doc_template(page_size, filename, document_title,
|
|||||||
footer_box, page_box = page_box.split_y(0.25 * inch, direction='u')
|
footer_box, page_box = page_box.split_y(0.25 * inch, direction='u')
|
||||||
header_box, page_box = page_box.split_y(0.75 * inch, direction='d')
|
header_box, page_box = page_box.split_y(0.75 * inch, direction='d')
|
||||||
title_box, report_box = header_box.split_x(3.5 * inch, direction='r')
|
title_box, report_box = header_box.split_x(3.5 * inch, direction='r')
|
||||||
|
|
||||||
|
on_page_lambda = (lambda c, _:
|
||||||
|
draw_header_footer(c, report_box, title_box,
|
||||||
|
footer_box,title=title,
|
||||||
|
supervisor=supervisor,
|
||||||
|
document_subheader=document_subheader,
|
||||||
|
client=client, doc_title=document_header))
|
||||||
|
|
||||||
|
frames = [Frame(page_box.min_x, page_box.min_y, page_box.width, page_box.height)]
|
||||||
|
|
||||||
page_template = PageTemplate(id="Main",
|
page_template = PageTemplate(id="Main",
|
||||||
frames=[Frame(page_box.min_x, page_box.min_y, page_box.width, page_box.height)],
|
frames=frames,
|
||||||
onPage=lambda c, _: draw_header_footer(c, report_box, title_box, footer_box,
|
onPage=on_page_lambda)
|
||||||
title=title, supervisor=supervisor,
|
|
||||||
document_subheader=document_subheader,
|
|
||||||
client=client,
|
|
||||||
doc_title=document_header))
|
|
||||||
|
|
||||||
pdfmetrics.registerFont(TTFont('Futura', 'Futura.ttc'))
|
pdfmetrics.registerFont(TTFont('Futura', 'Futura.ttc'))
|
||||||
doc = ADRDocTemplate(filename,
|
doc = ADRDocTemplate(filename,
|
||||||
|
|||||||
62
reaper/Export Items as Text.py
Normal file
62
reaper/Export Items as Text.py
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
# Export Items as Text.py
|
||||||
|
# (c) 2021 Jamie Hardt. All rights reserved.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
import json
|
||||||
|
import os.path
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
item_records = list()
|
||||||
|
|
||||||
|
for i in range(0, RPR_CountMediaItems(0) ):
|
||||||
|
this_item = RPR_GetMediaItem(0, i)
|
||||||
|
|
||||||
|
item_record = {}
|
||||||
|
item_record["mute"] = True if RPR_GetMediaItemInfo_Value(this_item, "B_MUTE_ACTUAL") > 0. else False
|
||||||
|
|
||||||
|
item_record["duration"] = RPR_GetMediaItemInfo_Value(this_item, "D_LENGTH")
|
||||||
|
_, item_record["duration_tc"], _, _, _ = RPR_format_timestr_len(item_record["duration"], "", 128, 0., 5)
|
||||||
|
|
||||||
|
item_record["position"] = RPR_GetMediaItemInfo_Value(this_item, "D_POSITION")
|
||||||
|
_, item_record["position_tc"], _, _ = RPR_format_timestr_pos(item_record["position"], "", 128, 5)
|
||||||
|
|
||||||
|
item_record["selected"] = True if RPR_GetMediaItemInfo_Value(this_item, "B_UISEL") > 0. else False
|
||||||
|
_, _, _, item_record["notes"], _ = RPR_GetSetMediaItemInfo_String(this_item, "P_NOTES", "", False)
|
||||||
|
_, _, _, item_record["item_guid"], _ = RPR_GetSetMediaItemInfo_String(this_item, "GUID", "", False)
|
||||||
|
|
||||||
|
active_take = RPR_GetActiveTake(this_item)
|
||||||
|
_, _, _, item_record["active_take_name"], _ = RPR_GetSetMediaItemTakeInfo_String(active_take, "P_NAME", "", False)
|
||||||
|
_, _, _, item_record["active_take_guid"], _ = RPR_GetSetMediaItemTakeInfo_String(active_take, "GUID", "", False)
|
||||||
|
|
||||||
|
item_track = RPR_GetMediaItemTrack(this_item)
|
||||||
|
_, _, _, item_record["track_name"], _ = RPR_GetSetMediaTrackInfo_String(item_track, "P_NAME", "", False)
|
||||||
|
_, _, _, item_record["track_guid"], _ = RPR_GetSetMediaTrackInfo_String(item_track, "GUID", "", False)
|
||||||
|
item_record["track_index"] = RPR_GetMediaTrackInfo_Value(item_track, "IP_TRACKNUMBER")
|
||||||
|
item_record["track_muted"] = True if RPR_GetMediaTrackInfo_Value(item_track, "B_MUTE") > 0. else False
|
||||||
|
|
||||||
|
item_records = item_records + [item_record]
|
||||||
|
|
||||||
|
output = dict()
|
||||||
|
output["items"] = item_records
|
||||||
|
_, output["project_title"], _ = RPR_GetProjectName(0, "", 1024)
|
||||||
|
_, _, output["project_author"], _ = RPR_GetSetProjectAuthor(0, False, "", 1024)
|
||||||
|
output["project_frame_rate"], _, output["project_drop_frame"] = RPR_TimeMap_curFrameRate(0, True)
|
||||||
|
|
||||||
|
output_path, _ = RPR_GetProjectPath("", 1024)
|
||||||
|
|
||||||
|
now = datetime.datetime.now()
|
||||||
|
output_title = output["project_title"]
|
||||||
|
|
||||||
|
if output_title == "":
|
||||||
|
output_title = "unsaved project"
|
||||||
|
|
||||||
|
output_file_name = "%s Text Export %s.txt" % (output_title, now.strftime('%Y%m%d_%H%M'))
|
||||||
|
output_path = output_path + "/" + output_file_name
|
||||||
|
|
||||||
|
with open(output_path, "w") as f:
|
||||||
|
json.dump(output, f, allow_nan=True, indent=4)
|
||||||
|
|
||||||
|
RPR_ShowMessageBox("Exported text file \"%s\" to project folder." % output_file_name, "Text Export Complete", 0)
|
||||||
|
|
||||||
|
#RPR_ShowConsoleMsg(output_path)
|
||||||
5
setup.py
5
setup.py
@@ -25,9 +25,10 @@ setup(name='ptulsconv',
|
|||||||
'Topic :: Multimedia :: Sound/Audio',
|
'Topic :: Multimedia :: Sound/Audio',
|
||||||
"Programming Language :: Python :: 3.7",
|
"Programming Language :: Python :: 3.7",
|
||||||
"Programming Language :: Python :: 3.8",
|
"Programming Language :: Python :: 3.8",
|
||||||
|
"Programming Language :: Python :: 3.9",
|
||||||
|
"Programming Language :: Python :: 3.10",
|
||||||
"Development Status :: 4 - Beta",
|
"Development Status :: 4 - Beta",
|
||||||
"Topic :: Text Processing :: Filters",
|
"Topic :: Text Processing :: Filters"],
|
||||||
"Topic :: Text Processing :: Markup :: XML"],
|
|
||||||
packages=['ptulsconv'],
|
packages=['ptulsconv'],
|
||||||
keywords='text-processing parsers film tv editing editorial',
|
keywords='text-processing parsers film tv editing editorial',
|
||||||
install_requires=['parsimonious', 'tqdm', 'reportlab'],
|
install_requires=['parsimonious', 'tqdm', 'reportlab'],
|
||||||
|
|||||||
Reference in New Issue
Block a user