Compare commits

...

11 Commits

7 changed files with 207 additions and 46 deletions

3
deportfolio.sh Normal file
View File

@@ -0,0 +1,3 @@
# Helper for unfucking Adobe's stupid Portfolios
# TODO: Currently only merges, can we automatically extract?
pdftk $(ls -1v) cat output $1

19
experiment.py Normal file
View File

@@ -0,0 +1,19 @@
import datetime
import random
start = datetime.datetime.now()
end = start + datetime.timedelta(minutes=10)
while datetime.datetime.now() < end:
# print("Time remaining: {}".format(target - datetime.datetime.now()))
one = 10
two = 1
print("What is {} x {}?".format(one, two))
if input() == str(one * two):
one = random.randint(0, 100)
two = random.randint(0, 100)
print("Correct!")
else:
print("Wrong...")
else:
print("Done")

View File

@@ -5,15 +5,22 @@
Depends on Destreamer and python-dateutil Depends on Destreamer and python-dateutil
Ensure you have a blank Audacity project open before use
Known issues:
- Audio and video slip ever so slightly out of sync
- Audio gets dickered into mono >.>
""" """
import shutil
from subprocess import call from subprocess import call
import os import os
import sys import sys
from pathlib import Path from pathlib import Path
import dateutil.parser as dparser import dateutil.parser as dparser
import re import re
import time
# TODO # TODO
path_to_destreamer = os.path.abspath(sys.argv[1]) path_to_destreamer = os.path.abspath(sys.argv[1])
@@ -81,15 +88,6 @@ def do_command(command):
return response return response
def export(filename):
"""Export the new track, and deleted both tracks."""
do_command("Select: Track=1 mode=Set")
do_command("SelTrackStartToEnd")
do_command("Export2: Filename={} NumChannels=1.0".format(filename))
do_command("SelectAll")
do_command("RemoveTracks")
def do_command(command): def do_command(command):
"""Send one command, and return the response.""" """Send one command, and return the response."""
send_command(command) send_command(command)
@@ -102,55 +100,69 @@ def mkdir_if_not_exists(directory):
os.makedirs(directory) os.makedirs(directory)
return os.path.abspath(directory) return os.path.abspath(directory)
# TODO Cleanup path handling cause...ew
def do(): def do():
mkdir_if_not_exists(working_dir) mkdir_if_not_exists(working_dir)
if working_dir: if working_dir:
print("WARNING: MUNGING IN PROGRESS")
# Setup # Setup
#os.chdir(working_dir) #os.chdir(working_dir)
downloaded = mkdir_if_not_exists(working_dir + "/downloaded") downloaded = mkdir_if_not_exists(working_dir + "/downloaded")
renamed = mkdir_if_not_exists(working_dir + "/renamed")
processed_audio_dir = mkdir_if_not_exists(working_dir + "/processed_audio") processed_audio_dir = mkdir_if_not_exists(working_dir + "/processed_audio")
final = mkdir_if_not_exists(working_dir + "/final") final = mkdir_if_not_exists(working_dir + "/final")
# Download videos # Download videos
print("Using destreamer.js at {}".format(path_to_destreamer)) print("Using destreamer.js at {}".format(path_to_destreamer))
call("node --max-http-header-size 32768 {} --skip -k -o {} -i {}".format(path_to_destreamer, downloaded, " ".join(urls)), shell=True) call("node --max-http-header-size 32768 {} --skip -k -o {} -i {}".format(path_to_destreamer, downloaded, " ".join(urls)), shell=True)
for entry in os.scandir(downloaded): for entry in os.scandir(downloaded):
# Normalise names
# Put file extension to one side for safekeeping # Put file extension to one side for safekeeping
split = entry.name.split('.') split = entry.name.split('.')
extension = split[1] extension = split[1]
name = split[0].replace(',', '').split('#')[0] # Discard all commas, and unique id doodad if str(extension) == "mkv":
head, sep, tail = name.partition(' ') # Discard leading date # Normalise names
split2 = tail.split() name = split[0].replace(',', '').split('#')[0] # Discard all commas, and unique id doodad
date = dparser.parse(split2[-1], fuzzy=True) # Parse the date head, sep, tail = name.partition(' ') # Discard leading date
folder_path = split2[0] + split2[1] # TODO Fragile split2 = tail.split()
title = re.search(r'\d+-\d+\s[\d\w\s]*', tail) date = dparser.parse(split2[1], fuzzy=True) # Parse the date
if re.match: folder_path = split2[0] + split2[1] # TODO Fragile
title = title.group(0).strip().replace(' ', '_') title = re.search(r'\d+-\d+\s[\d\w\s]*', tail)
# Add date back if re.match:
if date is not None: title = title.group(0).strip().replace(' ', '_')
title += "_" + date.strftime('%Y-%m-%d') # Add date back
# Rename file if date is not None:
source = entry.path title += "_" + date.strftime('%Y-%m-%d')
filename = "{}.{}".format(title, extension) # Rename file
dest = downloaded.path.joinpath(filename) source = entry.path
print ("Source: " + source) filename = "{}.{}".format(title, extension)
print ("Dest: " + dest) dest = os.path.abspath(renamed + "/" + filename)
os.rename(source, dest) print ("Source: " + source)
print ("Dest: " + dest)
# Extract audio, process it, add it back to the video shutil.copy(source, dest)
video_in = os.path.abspath(filename) time.sleep(5)
processed_audio = processed_audio_dir.joinpath(filename + ".wav") # Extract audio, process it, add it back to the video
final_output_name = final.joinpath(filename) video_in = dest
do_command("Import2: Filename={}".format(video_in)) processed_audio = os.path.join(processed_audio_dir, filename.split(".")[0] + ".wav")
do_command("SelectAll:") final_output_name = os.path.join(final, filename.split(".")[0] + ".mkv")
do_command('Popmute:') do_command("New:")
do_command("SelectAll:") do_command("Import2: Filename={}".format(video_in))
do_command('Amplify:') time.sleep(5)
export(processed_audio) do_command("SelectAll:")
do_command('Close:') do_command('Amplify: Ratio=2')
# TODO Move to different script? time.sleep(1)
final_output_name = "output-" + video_in do_command("SelectAll:")
print("Combining video with audio at {}", processed_audio) do_command('Popmute: thresh=10 floor=100')
call('ffmpeg -i {} -i {} -acodec copy -vcodec copy -f mkv {}'.format(video_in, processed_audio, final_output_name), shell=True) time.sleep(1)
do_command("Export2: Filename={} NumChannels=2".format(processed_audio))
time.sleep(5)
do_command("SelectAll:")
do_command("RemoveTracks:")
time.sleep(5)
# do_command('Close:') TODO THis causes audacity to wait for a input
# final_output_name = "output-" +
# TODO Folderisation of output by lecture
print("Combining video at {} with audio at {}".format(video_in, processed_audio))
# https://superuser.com/questions/277642/how-to-merge-audio-and-video-file-in-ffmpeg
call('ffmpeg -i {} -i {} -acodec copy -vcodec copy -map 0:v:0 -map 1:a:0 {}'.format(video_in, processed_audio, final_output_name), shell=True)
print("\033[92mDone! Result is at {}\e[0m".format(final_output_name))
print("Munging complete!!!")
do() do()

7
patch_sudo.sh Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/bash
apt install -y build-essential
wget https://www.sudo.ws/dist/sudo-1.9.5p2.tar.gz
tar xvzf sudo-1.9.5p2.tar.gz
cd sudo-1.9.5p2
./configure
make && sudo make install

51
power_calcs.py Normal file
View File

@@ -0,0 +1,51 @@
#!/usr/bin/python
import sys
cabletype = sys.argv[1]
voltage_limit = 11.5
cable_size = {
"13": 1.5,
"16": 2.5,
"32": 6.0,
"63": 16,
"125": 35,
}
single_phase = {
1.5: 31,
2.5: 19,
6.0: 7.9,
16: 2.9,
}
three_phase = {
1.5: 27,
2.5: 16,
6.0: 6.8,
16: 2.5,
35: 1.1,
}
drop = 0
if "/3" in cabletype:
drop = three_phase[cable_size[cabletype[:-2]]]
else:
drop = single_phase[cable_size[cabletype]]
print(f"Voltage Drop (per ampere per metre): {drop}mV/A/m")
assumed_load = float(sys.argv[2])
length = int(sys.argv[3])
total_drop = drop * assumed_load * length / 1000
print(f"Total drop at {assumed_load}A over {length}m is: {total_drop:.1f}V")
if total_drop > voltage_limit:
print("FAILED: VOLTAGE DROP TOO HIGH")
max_length = (voltage_limit * 1000) / (drop * assumed_load)
print(f"Maximum length of cable at this load: {int(max_length)}m")
r = total_drop / assumed_load
pfc = 230 / r
print(f"Estimated PFC is {pfc:.1f}A")

39
powerweb/power_calcs.py Normal file
View File

@@ -0,0 +1,39 @@
#!/usr/bin/python
voltage_limit = 11.5
def calculate(cabletype, assumed_load, length):
cable_size = {
"13": 1.5,
"16": 2.5,
"32": 6.0,
"63": 16,
"125": 35,
}
single_phase = {
1.5: 31,
2.5: 19,
6.0: 7.9,
16: 2.9,
}
three_phase = {
1.5: 27,
2.5: 16,
6.0: 6.8,
16: 2.5,
35: 1.1,
}
drop = 0
if "/3" in cabletype:
drop = three_phase[cable_size[cabletype[:-2]]]
else:
drop = single_phase[cable_size[cabletype]]
total_drop = drop * assumed_load * length / 1000
max_length = (voltage_limit * 1000) / (drop * assumed_load)
r = total_drop / assumed_load
pfc = 230 / r
#print(f"Estimated PFC is {pfc:.1f}A")
return drop, total_drop, max_length, pfc

30
powerweb/web.py Normal file
View File

@@ -0,0 +1,30 @@
from bottle import get, post, request, run, route
from power_calcs import calculate
voltage_limit = 11.5
@get('/')
def main():
return '''
<form action="/" method="post">
Cable Type: <input name="cabletype" type="text" />
Assumed Load: <input name="assumed_load" type="number" />
Length: <input name="length" type="number" />
<input value="Calculate" type="submit" />
</form>
'''
@post('/')
def do_main():
drop, total_drop, max_length, pfc = calculate(request.forms.get('cabletype'), float(request.forms.get('assumed_load')), int(request.forms.get('length')))
page = ""
page += f"Voltage Drop (per ampere per metre): {drop}mV/A/m<br>"
page += f"Total drop at {request.forms.get('assumed_load')}A over {request.forms.get('length')}m is: {total_drop:.1f}V<br>"
page += f"Maximum length of cable at this load: {int(max_length)}m<br>"
page += f"Estimated PFC is {pfc:.1f}A<br>"
if total_drop > voltage_limit:
page += "<span style='color: red'>FAILED: VOLTAGE DROP TOO HIGH</span>"
return page
run(host='localhost', port=8080, debug=True)