Skip to content
/ shottower Public

An open source, self-hosted implementation of the Shotstack API backend

License

Notifications You must be signed in to change notification settings

DblK/shottower

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

24 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ShotTower

golangci-lint ginkgo GitHub go.mod Go version of a Go module GoDoc reference example GoReportCard GitHub release

An open source, self-hosted implementation of the Shotstack backend server.

Join our Discord server for a chat.

What is ShotStack

ShotStack is a video editing API that allow to build dynamic Video Applications at Scale.

Everything in ShotStack is Open Source, except the Dashboard and the backend server.

The backend server translate JSON to FFMPEG commands and serve the result.

Design goal

shottower aims to implement a self-hosted, open source alternative to the Shotstack backend server. shottower has a narrower scope and are not built for heavy transcode (but pull request are welcome!).

shottower uses terms that maps to Shotstack's API, consult the glossary for explanations.

Support

If you like shottower and find it useful, there is a sponsorship and donation buttons available in the repo.

If you would like to sponsor features, bugs or prioritization, reach out to one of the maintainers.

Features (Basic Exclusive 😎)

  • "Basic" (Track, Clip, VideoAsset, ...) support of Shotstack's features (See bellow for progress)
    • Use only the stage endpoint value until all features are implemented (See #1 for multiple endpoint handling)
  • 😎 Possible to burn subtitle into video clip
  • 😎 Allow to use local file from url filed (file:///Users/dblk/clips/my_asset)
  • 😎 Add an endpoint /dl/{version}/renders/:id to download renders (instead of cdn/s3)
  • 😎 Add other values for resolution (360, 480, 540, 720) all with default 25 fps.
  • 😎 Add other values for output quality (highest, lowest).
  • [Planned] Allow to use ftp file from url filed (ftp://user:[email protected]/mypath/my_asset)
  • [Planned] Add destination to Youtube

Shotstack implementation progress

In the following matrix, there is only components than their implementation have been started.
At the end of the road this section should either disappear or be full of Yes πŸ˜‡.

Component Property Implemented Comment
Timeline soundtrack Not yet
Timeline background Yes βœ…
Timeline fonts Not yet
Timeline tracks Yes βœ…
Timeline cache Yes βœ…
Track βœ… all βœ… Yes βœ…
Clip asset Partial πŸ›  Only VideoAsset & ImageAsset are handled
Clip start Yes βœ…
Clip length Yes βœ…
Clip fit Not yet
Clip scale Yes βœ…
Clip position Yes βœ…
Clip offset Not yet
Clip transition Not yet
Clip effect Not yet
Clip filter Not yet
Clip opacity Not yet
Clip transform Not yet
Clip [VideoAsset] all βœ… Yes βœ…
Clip [ImageAsset] all βœ… Yes βœ…
Clip [TitleAsset] all Not yet
Clip [HTMLAsset] all Not yet
Clip [AudioAsset] src Partial πŸ›  Download asset only
Clip [AudioAsset] trim Not yet
Clip [AudioAsset] volume Not yet
Clip [AudioAsset] effect Not yet
Clip [LumaAsset] src Partial πŸ›  Download asset only
Clip [LumaAsset] trim Not yet
Output format Partial πŸ›  Only mp4 & gif at the moment
Output resolution Yes βœ…
Output aspectRatio Not yet
Output size Yes βœ…
Output fps Yes βœ…
Output scaleTo Not yet
Output quality Yes βœ…
Output repeat Yes βœ…
Output range Not yet
Output poster Not yet
Output thumbnail Not yet
Output destinations Not yet
Callback Yes βœ…

Endpoint implementation

There are several endpoints that are available but not all of them are implemented.

Category Endpoint Description Status Comment
Edit Render asset Yes βœ…
Edit Get Render Status Partial πŸ›  Missing real owner
Edit Create Template Not yet
Edit List Template Not yet
Edit Retrieve Template Not yet
Edit Update Template Not yet
Edit Delete Template Not yet
Edit Render Template Not yet
Edit Inspect Media Not yet
Serve Get Asset Partial πŸ› 
Serve Delete Asset Not yet
Serve Get Asset by Render ID Not yet

Running shottower

Please have a look at the documentation under docs/.

Disclaimer

  1. We have nothing to do with shotstack
  2. The purpose of ShotTower is maintaining a working, self-hosted Shotstack api compatible backend.

Contributing

To contribute to shottower you would need the latest version of Go.

Code style

To ensure we have some consistency with contributions, this project has adopted linting and style/formatting rules:

The Go code is linted with golangci-lint.

Check out the .golangci.yml to see the specific configuration.

Commit message

To ensure, the changelog are well generated, please use prefix in your commit message as follow:

  • feat, features, feature: For new features
  • fix: For any fix
  • doc, docs: For any update in documentation (README, etc...)

And if you really need to commit something that is not working wip ou test are your friends.

Install development tools

Testing and building

To run the tests (solo execution):

ginkgo -r --randomize-all --randomize-suites --race --trace -cover

To run the tests during development:

ginkgo watch -r --randomize-all --race --trace

To build the program:

go build

Running the server

To run the server, follow these simple steps:

go run main.go

To run the server in a docker container

docker build --network=host -t shottower .

Once image is built use

docker run --rm -it shottower

Contributors

RΓ©my
RΓ©my Boulanouar