Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Magnussens #42

Merged
merged 40 commits into from
Mar 22, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
a04ab3d
added basic magnussens form, front end only
mrharpo Feb 18, 2021
728a6fa
added alfred logo!
mrharpo Feb 19, 2021
c1be520
added logo to menu!
mrharpo Feb 19, 2021
d3aefb9
updated render function to use renderMultitrack
mrharpo Feb 19, 2021
4582b77
split magnussens into own file
mrharpo Feb 19, 2021
4a02292
upgrade otto, update docker image
mrharpo Feb 20, 2021
c5849fd
breaking change: remove media field from api render call
mrharpo Feb 20, 2021
b2905e9
buildEdl in js after form submit
mrharpo Feb 20, 2021
3fda94e
added offer and legal templates
mrharpo Feb 20, 2021
d75ea83
reroute to /renders after render button
mrharpo Feb 20, 2021
8626fda
updated edl.time to edl.duration
mrharpo Feb 20, 2021
3a5da25
added ./alfred reload to restart otto image
mrharpo Feb 20, 2021
6f3b6b5
reworked layout to copy from magnus
mrharpo Feb 20, 2021
aac7be2
working template preview and render for Magnussens!!!
mrharpo Feb 20, 2021
f0fc3e5
working celery worker for prod!
mrharpo Feb 21, 2021
eda9025
partially working bezier fly in fx!
mrharpo Feb 22, 2021
b7e50d1
working Magnussens template renderer!!!
mrharpo Feb 22, 2021
17e4ab5
quick fix to not render video as part of preview
mrharpo Feb 22, 2021
844c300
split form field name from text
mrharpo Feb 26, 2021
edd16dd
added Selector component and integrated with duration options
mrharpo Feb 26, 2021
fa693fc
fixed preview with consistent parameter naming
mrharpo Feb 26, 2021
1109b5f
quick fix for variable start and duration
mrharpo Feb 26, 2021
10d0f7e
reuse ImagePreview component
mrharpo Feb 26, 2021
9b0bd16
better formatting and arg passing into otto
mrharpo Feb 27, 2021
1d0658d
defined fonts for template sections!
mrharpo Feb 27, 2021
4836be1
pass ip to celery worker
mrharpo Feb 27, 2021
aed082d
audio defaults to None
mrharpo Feb 27, 2021
ee4bc06
fonts, resize now operate proportionate to (width*height)^.5
mrharpo Feb 28, 2021
6a117b0
added other resolutions
mrharpo Feb 28, 2021
400cdfa
working issue button with email sender!!!
mrharpo Mar 1, 2021
1c33986
added blank .email environment config
mrharpo Mar 1, 2021
a80830f
ignore .email config changes
mrharpo Mar 1, 2021
8a4e96a
fixed text size issue across resolutions!!
mrharpo Mar 1, 2021
3721852
added alternate video selection, with custom edl rules!
mrharpo Mar 1, 2021
c0e06ce
split components into own file
mrharpo Mar 3, 2021
04facb6
added offer alignment selector
mrharpo Mar 3, 2021
ea876d7
force auth on preview and render functions!
mrharpo Mar 3, 2021
40c85b5
added white background for 15s RSG format
mrharpo Mar 8, 2021
34edeba
changed carname font color and offer fontsize, per client
mrharpo Mar 9, 2021
09f2317
added username to render db entry
mrharpo Mar 9, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .email
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
EMAIL_SERVER=femail.harpo.me
EMAIL_PORT=587
EMAIL_USERNAME=alfred@quaternion.media
EMAIL_PASSWORD=""
EMAIL_SENDTO=""
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -51,3 +51,5 @@ api/data
*.png
*.jpg
*.edl

.email
10 changes: 8 additions & 2 deletions alfred
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,9 @@ elif [ $1 = "log" -o $1 = "logs" -o $1 = "l" ]; then

elif [ $1 = "worker" -o $1 = "w" ]; then
shift
celery worker --workdir api -A tasks:renderer -l debug -b pyamqp://192.168.192.13 --result-backend rpc://

# . operator used in place of source
. ./.cred
celery -A tasks:renderer --workdir api/ -b pyamqp://$1 --result-backend rpc:// worker
elif [ $1 = "dump" ]; then
shift
DATE=`date "+%Y-%m-%d-%H%M%S"`
Expand All @@ -96,4 +97,9 @@ elif [ $1 = "restore" ]; then
docker container cp $1 alfred_db_1:/$1
docker-compose exec db sh -c "mongorestore --gzip --db alfred --archive=/$1 --drop"

elif [ $1 = "reload" ]; then
shift
# reload otto
docker-compose -f docker-compose.yml -f dev.yml up -d --build api

fi
2 changes: 2 additions & 0 deletions api/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ RUN apk add g++ wget libffi-dev openssl-dev jpeg-dev cairo cairo-dev imagemagick

COPY requirements.txt /
RUN pip install -Ur /requirements.txt
COPY otto/requirements.txt /
RUN pip install numpy gizeh pillow
RUN pip install -Ur /requirements.txt
RUN pip install celery google-cloud-storage
RUN pip uninstall amqplib
RUN pip install librabbitmq
Expand Down
6 changes: 6 additions & 0 deletions api/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,9 @@
CELERY_BACKEND = environ.get('CELERY_BACKEND')

BUCKET_NAME = environ.get('ALFRED_BUCKET_NAME', 'tower-renders')

EMAIL_USERNAME = environ.get('EMAIL_USERNAME')
EMAIL_PASSWORD = environ.get('EMAIL_PASSWORD')
EMAIL_SERVER = environ.get('EMAIL_SERVER')
EMAIL_PORT = environ.get('EMAIL_PORT')
EMAIL_SENDTO = environ.get('EMAIL_SENDTO')
21 changes: 21 additions & 0 deletions api/emailer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from smtplib import SMTP
from email.message import EmailMessage
import config

def sendMail(message, subject):
try:
msg = EmailMessage()
msg.set_content(message)
msg['Subject'] = subject
msg['From'] = config.EMAIL_USERNAME
msg['To'] = config.EMAIL_SENDTO
s=SMTP(config.EMAIL_SERVER, config.EMAIL_PORT)
s.set_debuglevel(1)
s.starttls()
s.login(config.EMAIL_USERNAME, config.EMAIL_PASSWORD)
s.send_message(msg)
s.quit()
return True
except Exception as e:
print('error sending email', e)
return False
41 changes: 24 additions & 17 deletions api/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from math import floor
from config import BUCKET_NAME
from bucket import generate_signed_url
from emailer import sendMail

def seconds(t):
return sum(x * round(float(s), 2) for x, s in zip([3600, 60, 1], t.split(":")))
Expand Down Expand Up @@ -81,7 +82,7 @@ def updateProgress(id, progress):
# REST Routing :
# TODO: as it grows length -> breakout file into suporting files as needed, e.g. dbm'database manager', util'utiliy', etc.
app = FastAPI()
app.mount('/otto', ottoApi)
app.include_router(ottoApi, prefix='/otto', dependencies=[Depends(get_current_active_user)])

@app.on_event("startup")
async def seedDb():
Expand Down Expand Up @@ -123,27 +124,25 @@ async def download_file(filename: str):


@app.post('/render')
async def queueRender(prog: BackgroundTasks, edl: Edl, project: str, width: int = 1920, height: int = 1080):
async def queueRender(prog: BackgroundTasks, project: str, width: int = 1920, height: int = 1080, edl: Edl = Body(...), user: User = Depends(get_current_active_user)):
ts = timestr()
duration = sum(c['duration'] for c in edl.edl)
filename = f'{project}_{width}x{height}_{duration}s_{ts}.mp4'
media = db.projects.find_one({'name': project}, ['form'])['form']['media']
id = db.renders.insert_one({
filename = f'{project}_{width}x{height}_{edl.duration}s_{ts}.mp4'
render = {
'user': user.username,
'project': project,
'filename': filename,
'duration': duration,
'duration': edl.duration,
'resolution': (width, height),
'media': media,
'edl': edl.edl,
'progress': 0,
'started': ts,
'link': join('https://storage.googleapis.com/', BUCKET_NAME, filename),
}
).inserted_id
proj = db.projects.find_one({'name': project}, ['form'])['form']
print('rendering!', filename, proj)
media = [ download(m) for m in proj['media'] ]
task = renderRemote.delay(edl=edl.edl, media=media, audio=download(proj['audio'][0]), filename=filename, moviesize=(width, height))
# media = db.projects.find_one({'name': project}, ['form'])['form']['media']
id = db.renders.insert_one(render).inserted_id
print('rendering!', render)
# media = [ download(m) for m in proj['media'] ]
task = renderRemote.delay(edl=edl.edl, filename=filename, moviesize=(width, height))
def updateRenderProgress(progress):
r = progress.get('result')
# print('updating progress', r)
Expand Down Expand Up @@ -187,10 +186,11 @@ def pauseRender(user: User = Depends(get_current_active_user)):
@app.put('/renders/{render}/cancel')
def cancelRender(render: str, user: User = Depends(get_current_active_user)):
# cancel selected render
res = db.renders.delete_one({'filename': render})
if res.deleted_count:
print('deleted render', render, res, res.deleted_count)
return res.deleted_count
res = db.renders.find_one_and_delete({'filename': render})
if res:
print('deleted render', render, res)
db.deleted.insert_one(res)
return
else:
return HTTPException(status_code=406, detail='no such entry in database')

Expand Down Expand Up @@ -298,6 +298,13 @@ async def saveFile(file, location='data'):
with open(join(location, file.filename), 'wb') as f:
f.write(data)

@app.post('/report')
async def reportIssue(name: str, issue: str = Body(...)):
if not sendMail(issue, name):
print('error reporting issue with ', name, issue)
raise HTTPException(status_code=500, detail='error sending email')


app.include_router(auth)
app.include_router(users)

Expand Down
2 changes: 1 addition & 1 deletion api/otto
2 changes: 2 additions & 0 deletions api/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ tinydb
pyjwt
passlib[bcrypt]
pymongo
celery
google-cloud-storage
6 changes: 3 additions & 3 deletions api/tasks.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from celery import Celery
from otto.render import renderEdl
from otto.render import renderMultitrack
import config
from logger import CeleryLogger
from os.path import join
Expand All @@ -9,8 +9,8 @@


@renderer.task(bind=True)
def renderRemote(self, edl, media, audio, filename, moviesize):
def renderRemote(self, edl, filename, audio=None, moviesize=(1920,1080)):
log = CeleryLogger(self)
renderEdl(edl, media, audio, join('videos', filename), moviesize, log)
renderMultitrack(edl, audio, join('videos', filename), moviesize, log)
upload(filename, directory='videos')
self.update_state(state='PROGRESS', meta={'status': 'uploaded'})
3 changes: 2 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ services:
- CELERY_BACKEND=rpc://
- DB_URL=mongodb://db:27017
- GOOGLE_APPLICATION_CREDENTIALS=/cred.json

env_file:
- .email

db:
image: mongo:bionic
Expand Down
72 changes: 72 additions & 0 deletions website/src/Components.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import m from 'mithril'
import { Menu } from './Menu'

export function Form() {
return {
view: vnode => {
return m('form', vnode.attrs, vnode.children)
}
}
}

export function TextBox() {
return {
view: vnode => {
return [
m('label.formlabel', {for: vnode.attrs.name}, vnode.attrs.text),
m('textarea', vnode.attrs),
m('br')
]
}
}
}
export function Button() {
return {
view: vnode => {
return m('input.button', vnode.attrs, vnode.children)
}
}
}

export function Img() {
return {
view: vnode => {
return m('img', vnode.attrs, vnode.children)
}
}
}

export function Selector() {
return {
view: vnode => {
return [
m('label.formlabel', { for: vnode.attrs.name }, vnode.attrs.text),
m('select', vnode.attrs, vnode.children.map(c => {
return m('option', {value: c}, c)
})),
m('br'),
]
}
}
}


export function Section() {
return {
view: vnode => {
return m('section', vnode.attrs, vnode.children)
}
}
}

export function Layout() {
return {
view: vnode => {
return [
m(Menu),
m(Section, vnode.attrs, vnode.children)
]
}
}
}

Loading