├── .gitignore ├── Makefile ├── README.md ├── appveyor.yml ├── bin ├── ZXPSignCmd ├── ZXPSignCmd.exe └── about.md ├── config.js ├── gulp ├── paths.js └── tasks │ ├── build.js │ ├── clean.js │ ├── lint.js │ └── watch.js ├── gulpfile.js ├── img ├── collapsed_view.PNG └── protio_wide_view.PNG ├── jsconfig.json ├── package.json ├── src ├── .debug ├── CSXS │ └── manifest.xml ├── bin │ └── set_debug_mode.bat ├── html │ └── opentimelineio.html ├── img │ ├── python.png │ └── terminal.png ├── js │ ├── lib │ │ └── app.js │ └── opentimelineio.js ├── jsx │ ├── json2.js │ └── opentimeline.jsx ├── lib │ ├── CSInterface.js │ └── jquery-1.9.1.js ├── python │ └── premiere-opentimelineio.py └── styles │ ├── _variables.scss │ ├── opentimelineio.scss │ ├── page_overrides │ └── opentimelineio.scss │ ├── partials │ ├── _base.scss │ ├── _buttons.scss │ └── _icons.scss │ └── vendor │ ├── bootstrap.css │ ├── devicon.css │ ├── font-awesome.css │ └── wing.css └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Jetbrains Webstorm project 6 | *.idea 7 | 8 | # Sublime Project 9 | *.sublime-project 10 | *.sublime-workspace 11 | 12 | # Python 13 | *.pyc 14 | 15 | # Runtime data 16 | pids 17 | *.pid 18 | *.seed 19 | 20 | # Directory for instrumented libs generated by jscoverage/JSCover 21 | lib-cov 22 | 23 | # Coverage directory used by tools like istanbul 24 | coverage 25 | 26 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 27 | .grunt 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build 34 | 35 | # Build files 36 | dist/ 37 | pydist/ 38 | *.egg-info 39 | .eggs 40 | 41 | # Dependency directory 42 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 43 | node_modules 44 | jspm_packages 45 | 46 | 47 | # Other 48 | .DS_Store 49 | .premiere_refresh_trigger 50 | 51 | # Certificate files for Adobe 52 | *.p12 53 | # Output folder 54 | output/ -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | DIST_DIR := $(shell pwd)/dist 2 | 3 | help: 4 | @echo "build - Create built extension for the current platform" 5 | @echo "install - Install the built extension" 6 | @echo "dev - Install in dev location" 7 | @echo "docs - Generate documentation" 8 | @echo "debug - Set the reg/plist keys for debugging a CEP extension" 9 | 10 | uname_S := None 11 | ifeq ($(OS),Windows_NT) 12 | uname_S := Windows 13 | else: 14 | uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') 15 | endif 16 | 17 | DIST_DIR := $(shell pwd)/dist 18 | 19 | clean: clean-build clean-gulp 20 | 21 | clean-build: 22 | rm -rf build/ 23 | rm -rf dist/ 24 | 25 | clean-gulp: 26 | gulp clean 2>/dev/null || true 27 | 28 | ifneq ($(uname_S), Windows) 29 | debug: 30 | defaults write com.adobe.CSXS.8 PlayerDebugMode 1 31 | endif 32 | 33 | _docs: 34 | gulp docs 35 | 36 | docs: _docs 37 | open docs/protio/index.html 38 | 39 | release-docs: _docs 40 | 41 | deps:~ 42 | yarn install 43 | jspm install 44 | 45 | build-dev: 46 | gulp watch 47 | 48 | 49 | build: 50 | ifneq ($(uname_S), Windows) 51 | gulp build-prod 52 | ./bin/ZXPSignCmd -sign dist output/protio.zxp MyCert.p12 abc123 53 | else 54 | gulp build-prod 55 | endif 56 | 57 | deploy: 58 | ifneq ($(uname_S), Windows) 59 | rm "/Library/Application Support/Adobe/CEP/extensions/protio" 2>/dev/null || true 60 | mkdir -p "/Library/Application Support/Adobe/CEP/extensions/protio" 2>/dev/null || true 61 | cp output/protio.zxp "/Library/Application Support/Adobe/CEP/extensions/protio/protio.zxp" 62 | else 63 | cmd /c rmdir /Q "%APPDATA%\\Adobe\\CEP\\extensions\\protio" 2>/dev/null || true 64 | xcopy /EHK output/protio.zxp "%APPDATA%\\Adobe\\CEP\\extensions\\protio\\protio.zxp" 65 | endif 66 | 67 | 68 | ifeq ($(uname_S), Windows) 69 | dev: clean 70 | cmd /c rmdir /Q "%APPDATA%\\Adobe\\CEP\\extensions\\protio" 2>/dev/null || true 71 | cmd /c mklink /J "%APPDATA%\\Adobe\\CEP\\extensions\\protio" "$(shell cygpath -w $(DIST_DIR))" 72 | gulp watch 73 | else 74 | dev: clean 75 | rm "/Library/Application Support/Adobe/CEP/extensions/protio" 2>/dev/null || true 76 | ln -s $(DIST_DIR) "/Library/Application Support/Adobe/CEP/extensions/protio" 77 | gulp watch 78 | endif 79 | 80 | uninstall: 81 | cmd /c rmdir /Q "%APPDATA%\\Adobe\\CEP\\extensions\\premiere-otio" 2>/dev/null || true 82 | 83 | ifneq ($(uname_S), Windows) 84 | create-cert: 85 | ./bin/ZXPSignCmd -selfSignedCert US OR MyCompanyName MyPersonName abc123 MyCert.p12 86 | endif 87 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Protio 2 | ======== 3 | Premiere OpenTimelineIO extension. Pronounced "Pro-T-Oh". 4 | 5 | Allows you to import and export OpenTimelineIO sequences, and launch the otioview application. 6 | 7 |  8 | 9 |  10 | 11 | Contribution 12 | ============= 13 | [Michael Nowakowski](https://github.com/pantsworth) - Helped a lot on the UI design 14 | 15 | [Bruce Bullis](https://github.com/bbb999) - Insurmountable Premiere Wisdom 16 | 17 | Installation 18 | ============= 19 | ##### Building requirements: 20 | 21 | - npm or yarn (yarn is in the make file, change it to npm if you need to) 22 | - gulp 23 | - jspm 24 | - make 25 | - On Windows, cygwin. cmd is not supported. 26 | 27 | ##### Runtime requirements: 28 | 29 | - Python 2.7/3.6+ 30 | 31 | 32 | ## Building For Dev: 33 | 34 | If you're not familiar with make, you should [get familiar with it first](https://www.gnu.org/software/make/#content). 35 | 36 | To build a local dev copy in order to do work, you have to build a folder path first. That folder path is: 37 | 38 | ```markdown 39 | "%APPDATA%\\Adobe\\CEP\\extensions\\protio" 40 | ``` 41 | 42 | or 43 | 44 | ```markdown 45 | /Library/Application Support/Adobe/CEP/extensions/protio 46 | ``` 47 | 48 | 49 | ```markdown 50 | cd /c/dev/protio 51 | yarn global add gulp (This is only required the very first time) 52 | yarn global add jspm (This is only required the very first time) 53 | make deps 54 | make build-dev 55 | gulp watch (Doesn't seem to be picking up on Windows inside build-dev, need to look into this). 56 | ``` 57 | 58 | If you notice inside of the protio source folder, there is a .debug file. This file states what port the extension 59 | is debugged on, which is 6145. Go to `localhost:6145` in a Chrome browser and you can do debugging. 60 | 61 | However, you can't do that just yet if this is your first time developing an Adobe CEP extension. You can't even open the 62 | extension inside of Premiere yet, even though it shows up under Window > Extensions > Protio 63 | 64 | If you are in the midst of development, you can bypass the check for extension signature by editing the CSXS preference 65 | properties file, located at: 66 | 67 | ``` 68 | Win: regedit > 69 | HKEY_CURRENT_USER/Software/Adobe/CSXS.8 70 | Add a new entry PlayerDebugMode of type "string" with the value of "1". 71 | ``` 72 | 73 | ``` 74 | Mac: In the terminal, type: 75 | defaults write com.adobe.CSXS.8 PlayerDebugMode 1 76 | (The plist is also located at /Users/USERNAME/Library/Preferences/com.adobe.CSXS.8.plist) 77 | ``` 78 | 79 | This puts your Adobe apps into debug mode, and now you can open the application. 80 | 81 | While Gulp is running, you can update files and close and reopen the extension to test changes. At a studio that I used 82 | to work at, we had a Ctrl + R refresh working at some point, but an update eventually ruined what allowed that to work. 83 | It currently works intermittently and eventually stops working altogether. 84 | 85 | Additionally, you can now go to [localhost:6145](http://localhost:6145) and run the debugger. 86 | 87 | ## Building for Release: 88 | 89 | 90 | Usage 91 | ====== 92 | After installing, go to Window > Extensions > Protio 93 | 94 | Then, click either the `import otio as sequence` button or the `export sequence as otio` button. 95 | 96 | 97 | Deployment 98 | =========== 99 | If you work in a studio environment... have fun. Adobe deployment for their packages is atrocious 100 | and is not built for a scalable, distributed solution like one that is needed at visual effects studios. 101 | Ironic, right? They have this desire to want to put everything in their store, but stuff like that does not 102 | work when you're off network, or need to push out constant updates. 103 | 104 | At the studio that I used to work at, we had a deployment manager called Ansible (but you can do the same thing 105 | with a Docker container) that moved packages around on disk and we would put a variation of the development 106 | workflow on disk locally for the editors. 107 | 108 | To build everything out into a deployable package, run 109 | 110 | ```markdown 111 | make build 112 | ``` 113 | 114 | This will make a folder called dist/ and a folder called output, and you want to take the built extension from the output 115 | folder and distribute that. 116 | 117 | As a note, the Makefile contains default fake data in the build step for the ZXPSignCmd. Fill this with information for 118 | you or your organization. 119 | 120 | Finally, you can run the 121 | 122 | ```markdown 123 | make deploy 124 | ``` 125 | 126 | step which will place the built .zxp in the output/ folder in the correct location for Premiere to find it. 127 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | # Test against the latest version of this Node.js version 2 | environment: 3 | nodejs_version: "6" 4 | 5 | # Install scripts. (runs after repo cloning) 6 | install: 7 | # Get the latest stable version of Node.js or io.js 8 | - ps: Install-Product node $env:nodejs_version 9 | # install modules 10 | - npm install 11 | 12 | # Post-install test scripts. 13 | test_script: 14 | # Output useful info for debugging. 15 | - node --version 16 | - npm --version 17 | # run tests 18 | - npm test 19 | 20 | # Don't actually build. 21 | build: off 22 | -------------------------------------------------------------------------------- /bin/ZXPSignCmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boredstiff/protio/37f50be177c9204fc0a2ac413e2745fa32cfcaf7/bin/ZXPSignCmd -------------------------------------------------------------------------------- /bin/ZXPSignCmd.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/boredstiff/protio/37f50be177c9204fc0a2ac413e2745fa32cfcaf7/bin/ZXPSignCmd.exe -------------------------------------------------------------------------------- /bin/about.md: -------------------------------------------------------------------------------- 1 | As best as I know, this is version 4.0.7 of the ZXPSignCmd. Why wouldn't Adobe put something as simple as the 2 | version number into one of their tools? Your guess is as good as mine. 3 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | System.config({ 2 | defaultJSExtensions: true, 3 | transpiler: "babel", 4 | babelOptions: { 5 | "optional": [ 6 | "runtime", 7 | "optimisation.modules.system" 8 | ] 9 | }, 10 | paths: { 11 | "*": "src/js/*", 12 | "github:*": "jspm_packages/github/*", 13 | "npm:*": "jspm_packages/npm/*" 14 | }, 15 | 16 | map: { 17 | "babel": "npm:babel-core@5.8.38", 18 | "babel-runtime": "npm:babel-runtime@5.8.38", 19 | "bootstrap": "npm:bootstrap@4.0.0-alpha.6", 20 | "core-js": "npm:core-js@1.2.7", 21 | "devicons": "npm:devicons@1.8.0", 22 | "font-awesome": "npm:font-awesome@4.7.0", 23 | "loglevel": "github:pimterry/loglevel@1.4.1", 24 | "path": "github:jspm/nodelibs-path@0.2.3", 25 | "process": "github:jspm/nodelibs-process@0.1.2", 26 | "shell-quote": "npm:shell-quote@1.6.1", 27 | "github:jspm/nodelibs-assert@0.1.0": { 28 | "assert": "npm:assert@1.4.1" 29 | }, 30 | "github:jspm/nodelibs-buffer@0.1.1": { 31 | "buffer": "npm:buffer@5.0.7" 32 | }, 33 | "github:jspm/nodelibs-path@0.1.0": { 34 | "path-browserify": "npm:path-browserify@0.0.0" 35 | }, 36 | "github:jspm/nodelibs-process@0.1.2": { 37 | "process": "npm:process@0.11.10" 38 | }, 39 | "github:jspm/nodelibs-util@0.1.0": { 40 | "util": "npm:util@0.10.3" 41 | }, 42 | "github:jspm/nodelibs-vm@0.1.0": { 43 | "vm-browserify": "npm:vm-browserify@0.0.4" 44 | }, 45 | "npm:assert@1.4.1": { 46 | "assert": "github:jspm/nodelibs-assert@0.1.0", 47 | "buffer": "github:jspm/nodelibs-buffer@0.1.1", 48 | "process": "github:jspm/nodelibs-process@0.1.2", 49 | "util": "npm:util@0.10.3" 50 | }, 51 | "npm:babel-runtime@5.8.38": { 52 | "process": "github:jspm/nodelibs-process@0.1.2" 53 | }, 54 | "npm:bootstrap@4.0.0-alpha.6": { 55 | "jquery": "npm:jquery@3.2.1", 56 | "tether": "github:HubSpot/tether@1.4.0" 57 | }, 58 | "npm:buffer@5.0.7": { 59 | "base64-js": "npm:base64-js@1.2.1", 60 | "ieee754": "npm:ieee754@1.1.8" 61 | }, 62 | "npm:core-js@1.2.7": { 63 | "fs": "github:jspm/nodelibs-fs@0.1.2", 64 | "path": "github:jspm/nodelibs-path@0.1.0", 65 | "process": "github:jspm/nodelibs-process@0.1.2", 66 | "systemjs-json": "github:systemjs/plugin-json@0.1.2" 67 | }, 68 | "npm:font-awesome@4.7.0": { 69 | "css": "github:systemjs/plugin-css@0.1.35" 70 | }, 71 | "npm:inherits@2.0.1": { 72 | "util": "github:jspm/nodelibs-util@0.1.0" 73 | }, 74 | "npm:path-browserify@0.0.0": { 75 | "process": "github:jspm/nodelibs-process@0.1.2" 76 | }, 77 | "npm:process@0.11.10": { 78 | "assert": "github:jspm/nodelibs-assert@0.1.0", 79 | "fs": "github:jspm/nodelibs-fs@0.1.2", 80 | "vm": "github:jspm/nodelibs-vm@0.1.0" 81 | }, 82 | "npm:shell-quote@1.6.1": { 83 | "array-filter": "npm:array-filter@0.0.1", 84 | "array-map": "npm:array-map@0.0.0", 85 | "array-reduce": "npm:array-reduce@0.0.0", 86 | "jsonify": "npm:jsonify@0.0.0" 87 | }, 88 | "npm:util@0.10.3": { 89 | "inherits": "npm:inherits@2.0.1", 90 | "process": "github:jspm/nodelibs-process@0.1.2" 91 | }, 92 | "npm:vm-browserify@0.0.4": { 93 | "indexof": "npm:indexof@0.0.1" 94 | } 95 | } 96 | }); 97 | -------------------------------------------------------------------------------- /gulp/paths.js: -------------------------------------------------------------------------------- 1 | var appRoot = 'src/' 2 | var outputRoot = 'dist' 3 | var baseRoot = './' 4 | 5 | module.exports = { 6 | root: appRoot, 7 | baseRoot: baseRoot, 8 | js: appRoot + 'js/**/*.js', 9 | jsToBundle: appRoot + 'js/*.js', 10 | jsToOutput: outputRoot + '/js', 11 | jsx: baseRoot + 'jsx/**/*.jsx', 12 | html: baseRoot + appRoot + 'html/*.html', 13 | css: appRoot + '**/*.css', 14 | less: appRoot + '**/*.less', 15 | sass: appRoot + '**/*.scss', 16 | outputRoot: outputRoot, 17 | htmlOutput: outputRoot, 18 | configjs: "config.js", 19 | doc: './doc', 20 | premiereTrigger: './.premiere_refresh_trigger', 21 | premiereDebug: appRoot + './.debug', 22 | devSymlinks: [ 23 | appRoot + 'CSXS', 24 | appRoot + 'js', 25 | appRoot + 'jsx', 26 | appRoot + 'img', 27 | appRoot + 'lib', 28 | appRoot + 'python', 29 | 'jspm_packages' 30 | ], 31 | prodCopy: [ 32 | appRoot + "CSXS/**.xml", 33 | appRoot + "files/**/*.*", 34 | appRoot + "img/**/*.*", 35 | appRoot + "jsx/**.*", 36 | appRoot + "lib/**.*", 37 | appRoot + "python/**.py", 38 | ], 39 | devJSPMCopy: [ 40 | 'package.json', 41 | 'jsconfig.json' 42 | ] 43 | } 44 | -------------------------------------------------------------------------------- /gulp/tasks/build.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp') 2 | var git = require('gulp-git') 3 | var gitRev = require('git-rev') 4 | var gulpDocumentation = require('gulp-documentation') 5 | var runSequence = require('run-sequence') 6 | var changed = require('gulp-changed') 7 | var sass = require('gulp-sass') 8 | var notify = require('gulp-notify') 9 | var paths = require('../paths') 10 | var path = require('path') 11 | var systemJs = require('systemjs-builder') 12 | var replace = require('gulp-replace') 13 | var vinylFS = require('vinyl-fs') 14 | 15 | gulp.task('build-css', function() { 16 | return gulp.src(paths.css) 17 | .pipe(changed(paths.outputRoot, {extension: 'css'})) 18 | .pipe(gulp.dest(paths.outputRoot)) 19 | }) 20 | 21 | gulp.task('build-sass', function() { 22 | gulp.src(paths.sass) 23 | .pipe(sass().on('error', notify.onError('Error: <%= error.message %>'))) 24 | .pipe(gulp.dest(paths.outputRoot)) 25 | }) 26 | 27 | gulp.task('build-docs', function() { 28 | return gulp.src('./src/js/**/*.js') 29 | .pipe(gulpDocumentation('html')) 30 | .pipe(gulp.dest('dist/docs')) 31 | }) 32 | 33 | gulp.task('build-dev-copy-jspm-config', function() { 34 | return gulp.src(paths.devJSPMCopy) 35 | .pipe(changed(paths.outputRoot)) 36 | .pipe(gulp.dest(paths.outputRoot)) 37 | }) 38 | 39 | gulp.task('build-dev-html', function() { 40 | return gitRev.tag(function(tag) { 41 | return gitRev.short(function(hash) { 42 | return gulp.src(paths.html) 43 | .pipe(changed(paths.htmlOutput)) 44 | .pipe(replace(/ 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 26 | 27 | 47 |
47 |                      53 |
53 |