Skip to content

Commit 2c81341

Browse files
Merge branch 'master' into heroku
2 parents adc8734 + 35d42ca commit 2c81341

File tree

4 files changed

+102
-14
lines changed

4 files changed

+102
-14
lines changed

.github/workflows/heroku-deploy.yaml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name: Deploy to Heroku
2+
3+
on:
4+
push:
5+
branches:
6+
- heroku
7+
8+
jobs:
9+
build-and-deploy:
10+
runs-on: ubuntu-latest
11+
12+
steps:
13+
- name: Checkout repository
14+
uses: actions/checkout@v4
15+
16+
- name: Login to Heroku Container Registry
17+
env:
18+
HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
19+
run: heroku container:login
20+
21+
- name: Build and push Docker image
22+
env:
23+
HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
24+
HEROKU_APP_NAME: ${{ secrets.HEROKU_APP_NAME }}
25+
run: |
26+
docker build -t registry.heroku.com/$HEROKU_APP_NAME/web .
27+
docker push registry.heroku.com/$HEROKU_APP_NAME/web
28+
29+
- name: Release to Heroku
30+
env:
31+
HEROKU_API_KEY: ${{ secrets.HEROKU_API_KEY }}
32+
HEROKU_APP_NAME: ${{ secrets.HEROKU_APP_NAME }}
33+
run: heroku container:release web -a $HEROKU_APP_NAME

Dockerfile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,14 @@ RUN DEBIAN_FRONTEND=noninteractive pip3 install \
9090
pyarrow \
9191
pandas \
9292
scipy \
93+
sympy \
9394
pyyaml
9495

96+
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y libcairo2-dev libpango1.0-dev
97+
RUN DEBIAN_FRONTEND=noninteractive pip3 install \
98+
pycairo \
99+
manim
100+
95101
### Perl
96102
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y perl
97103

README.md

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@ language: en
99
1010
narrator: US English Female
1111
12-
onload
12+
@onload
1313
window.CodeRunner = {
1414
ws: undefined,
1515
handler: {},
1616
connected: false,
1717
error: "",
1818
url: "",
19+
firstConnection: true,
1920
2021
init(url, step = 0) {
2122
this.url = url
@@ -98,22 +99,29 @@ window.CodeRunner = {
9899
}, 2000)
99100
100101
} else {
101-
sender.lia("LIA: wait")
102+
//sender.lia("LIA: wait")
102103
setTimeout(() => {
103-
sender.lia(this.error)
104+
sender.lia(" " + this.error)
105+
sender.lia(" Maybe reloading fixes the problem ...")
104106
sender.lia("LIA: stop")
105107
}, 800)
106108
}
107109
} else {
108-
109110
setTimeout(function() {
110111
self.send(uid, message, sender, false)
111112
}, 2000)
112113
113114
if (sender) {
115+
114116
sender.lia("LIA: terminal")
115-
//sender.log("waking up CodeRunner")
116-
sender.log("stream", "", ".")
117+
if (this.firstConnection) {
118+
this.firstConnection = false
119+
setTimeout(() => {
120+
sender.log("stream", "", [" Waking up execution server ...\n", "This may take up to 30 seconds ...\n", "Please be patient ...\n"])
121+
}, 100)
122+
} else {
123+
sender.log("stream", "", ".")
124+
}
117125
sender.lia("LIA: terminal")
118126
}
119127
}
@@ -299,6 +307,13 @@ CodeRunner.handle(uid, function (msg) {
299307
}
300308
}
301309
310+
if (msg.videos) {
311+
for(let i = 0; i < msg.videos.length; i++) {
312+
console.html("<hr/>", msg.videos[i].file)
313+
console.html("<video title='" + msg.videos[i].file + "' src='" + msg.videos[i].data + "'></video>")
314+
}
315+
}
316+
302317
if (msg.files) {
303318
let str = "<hr/>"
304319
for(let i = 0; i < msg.files.length; i++) {
@@ -1179,6 +1194,7 @@ window.CodeRunner = {
11791194
connected: false,
11801195
error: "",
11811196
url: "",
1197+
firstConnection: true,
11821198
11831199
init(url, step = 0) {
11841200
this.url = url
@@ -1261,30 +1277,38 @@ window.CodeRunner = {
12611277
}, 2000)
12621278
12631279
} else {
1264-
sender.lia("LIA: wait")
1280+
//sender.lia("LIA: wait")
12651281
setTimeout(() => {
1266-
sender.lia(this.error)
1282+
sender.lia(" " + this.error)
1283+
sender.lia(" Maybe reloading fixes the problem ...")
12671284
sender.lia("LIA: stop")
12681285
}, 800)
12691286
}
12701287
} else {
1271-
12721288
setTimeout(function() {
12731289
self.send(uid, message, sender, false)
12741290
}, 2000)
12751291
12761292
if (sender) {
1293+
12771294
sender.lia("LIA: terminal")
1278-
sender.log("stream", "", ".")
1295+
if (this.firstConnection) {
1296+
this.firstConnection = false
1297+
setTimeout(() => {
1298+
sender.log("stream", "", [" Waking up execution server ...\n", "This may take up to 30 seconds ...\n", "Please be patient ...\n"])
1299+
}, 100)
1300+
} else {
1301+
sender.log("stream", "", ".")
1302+
}
12791303
sender.lia("LIA: terminal")
12801304
}
12811305
}
12821306
}
12831307
}
12841308
12851309
//window.CodeRunner.init("wss://coderunner.informatik.tu-freiberg.de/")
1286-
window.CodeRunner.init("ws://127.0.0.1:8000/")
1287-
//((window.CodeRunner.init("wss://ancient-hollows-41316.herokuapp.com/")
1310+
//window.CodeRunner.init("ws://127.0.0.1:8000/")
1311+
window.CodeRunner.init("wss://ancient-hollows-41316.herokuapp.com/")
12881312
@end
12891313
12901314

server.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def spawn(self) -> None:
178178

179179
self.process.close()
180180

181-
self.stop(None, self.list_images(), self.filter_files())
181+
self.stop(None, self.list_images(), self.list_videos(), self.filter_files())
182182

183183
def filter_files(self):
184184
'''
@@ -226,6 +226,28 @@ def list_images(self):
226226

227227
return images
228228

229+
def list_videos(self):
230+
'''
231+
Search the current directory for all video files and return them as base64.
232+
'''
233+
234+
files = os.listdir(self.current_directory)
235+
files = list(map(lambda filename: self.current_directory + "/" + filename, files))
236+
files = sorted(filter(os.path.isfile, files), key=os.path.getmtime, reverse=True)
237+
238+
videos = []
239+
for filename in files:
240+
extension = pathlib.Path(filename).suffix.lower()[1:]
241+
242+
if extension in ["mp4", "avi", "mov", "mkv", "flv", "wmv", "webm"]:
243+
with open(filename, "rb") as video_file:
244+
videos.append({
245+
"file": pathlib.Path(filename).name,
246+
"data": "data:video/" + extension + ";base64," + base64.b64encode(video_file.read()).decode("utf8")
247+
})
248+
249+
return videos
250+
229251
def read_line(self) -> bool:
230252
'''
231253
Read in a bunch of max 2000 characters from stdin and send them back to
@@ -461,7 +483,7 @@ def stdout(data):
461483
"uid": message["uid"],
462484
"data": escape_ansi(data)}))
463485

464-
def stop(error_message: str | None = None, images=[], files=[]):
486+
def stop(error_message: str | None = None, images=[], videos=[], files=[]):
465487
resp = {"ok": True, "service": "stop", "uid": message["uid"]}
466488

467489
if error_message:
@@ -470,6 +492,9 @@ def stop(error_message: str | None = None, images=[], files=[]):
470492
if len(images) > 0:
471493
resp["images"] = images
472494

495+
if len(videos) > 0:
496+
resp["videos"] = videos
497+
473498
if len(files) > 0:
474499
resp["files"] = files
475500

0 commit comments

Comments
 (0)