---
# System prepended metadata

title: project-live-button-production
tags: [mk, ' projects']

---

---
tags: mk, projects
---


# project-live-button-production

### workflow for Thursday happy hour

- set up shoot
    - green or white background in the brick room
    - one camera for close ups
        - optional: one for full body shot
- prep materials
    - button supplies
    - neon paper







### workflow options

- capture images
    - screenshots of OBS with macOS screenshot tool
    - screenshots of OBS from OBS
    - capture to short video clips in hyperdeck
    - capture to long video clips in hyperdeck
- queue images to be processed
    - send macOS screenshots to folder with `defaults write`
    - send OBS screen captures to folder from within OBS preferences
    - pull stills from hyperdeck video
        - copy video over directly from rotating cards
        - pull video over ftp from shorter clips
        - use SD card duplicator?
- process images
    - in lightroom manually
    - with photoshop actions
    - using imagemagick on watch folder
    - using ffmpeg on watch folder
- print images
    - from lightroom
    - using #show-your-work to Airtable to Page Designer to Printer workflow
    - from InDesign using InDesign script


### script concepts

- one
    - screenshot
    - apply ffmpeg filters
    - upload to Slack (#show-your-work)
    - print from Airtable
- another
    - screenshot
    - apply magick filters
    - print from command line
    - send to Slack/Airtable for backup


### scripting notes

[on curves in ffmpeg](https://video.stackexchange.com/questions/14603/what-is-the-ffmpeg-filter-equivalent-of-automatic-levels-for-colors).
[on imagemagick normalize](https://imagemagick.org/script/command-line-options.php#normalize)

basic thing we were doing

`ffmpeg -i /Users/mk/Desktop/mk-1.jpg -vf "eq=contrast=2:brightness=0.35:saturation=0" /Users/mk/Desktop/mk-1-ffmpeg-test-5.png`

### plan for Thursday

Set up screenshots folder with
 
```
mkdir ~/Desktop/screenshots-for-buttons
defaults write com.apple.screencapture location ~/Desktop/screenshots-for-buttons
```

then let's watch this folder with [chokidar](https://www.npmjs.com/package/chokidar), making sure that we wait for file copy jobs to complete

```
var chokidar = require('chokidar');

var watcher = chokidar.watch(thePathToFolder, {ignored: /^\./, persistent: true, awaitWriteFinish: true});

watcher
  .on('add', function(path) {console.log('File', path, 'has been added');})
  .on('change', function(path) {console.log('File', path, 'has been changed');})
  .on('unlink', function(path) {console.log('File', path, 'has been removed');})
  .on('error', function(error) {console.error('Error happened', error);})
```


from the docs
```
  
  
const
// awaitWriteFinish: true


// Example of a more typical implementation structure

// Initialize watcher.
const watcher = chokidar.watch('file, dir, glob, or array', {
  ignored: /(^|[\/\\])\../, // ignore dotfiles
  persistent: true
});

// Something to use when events are received.
const log = console.log.bind(console);
// Add event listeners.
watcher
  .on('add', path => log(`File ${path} has been added`))
  .on('change', path => log(`File ${path} has been changed`))
  .on('unlink', path => log(`File ${path} has been removed`));

// More possible events.
watcher
  .on('addDir', path => log(`Directory ${path} has been added`))
  .on('unlinkDir', path => log(`Directory ${path} has been removed`))
  .on('error', error => log(`Watcher error: ${error}`))
  .on('ready', () => log('Initial scan complete. Ready for changes'))
  .on('raw', (event, path, details) => { // internal
    log('Raw event info:', event, path, details);
  });

// 'add', 'addDir' and 'change' events also receive stat() results as second
// argument when available: https://nodejs.org/api/fs.html#fs_class_fs_stats
watcher.on('change', (path, stats) => {
  if (stats) console.log(`File ${path} changed size to ${stats.size}`);
});

// Watch new files.
watcher.add('new-file');
watcher.add(['new-file-2', 'new-file-3', '**/other-file*']);

// Get list of actual paths being watched on the filesystem
var watchedPaths = watcher.getWatched();

// Un-watch some files.
await watcher.unwatch('new-file*');

// Stop watching.
// The method is async!
watcher.close().then(() => console.log('closed'));

// Full list of options. See below for descriptions.
// Do not use this example!
chokidar.watch('file', {
  persistent: true,

  ignored: '*.txt',
  ignoreInitial: false,
  followSymlinks: true,
  cwd: '.',
  disableGlobbing: false,

  usePolling: false,
  interval: 100,
  binaryInterval: 300,
  alwaysStat: false,
  depth: 99,
  awaitWriteFinish: {
    stabilityThreshold: 2000,
    pollInterval: 100
  },

  ignorePermissionErrors: false,
  atomic: true // or a custom 'atomicity delay', in milliseconds (default 100)
});


```

then when new images show up, let's convert them to black and white in the `b-and-w` folder, then move the originals out of the watch folder to a "completed" folder.

```

```

let's log all jobs to a growing md file.