Skip to content

Commit fb0478f

Browse files
committed
download fix, mix test, control video test, ssl mock
1 parent 234ba5a commit fb0478f

File tree

5 files changed

+208
-14
lines changed

5 files changed

+208
-14
lines changed

index.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,14 @@ app.post("/send",(req,res)=>{
165165
});
166166
});
167167

168-
app.listen(8082,()=>{
169-
console.log("listening " + 8082);
168+
169+
const https = require('https');
170+
const privateKey = fs.readFileSync('server.key', 'utf8');
171+
const certificate = fs.readFileSync('server.cert', 'utf8');
172+
const credentials = {key: privateKey, cert: certificate};
173+
var httpsServer = https.createServer(credentials, app);
174+
var port = 83;
175+
httpsServer.listen(port,"::1",()=>{
176+
console.log("listening " + port);
170177
});
178+

public/app.html

Lines changed: 77 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
}
1919
</style>
2020
<div style="display:flex;background-color:navy;color:white;padding:10px;">
21-
<div>🧊 NumberCooler Recorder</div>
21+
<div>🧊 NumberCooler Recorder Premium</div>
2222
</div>
2323
<div id="main" style="display:flex;padding:0px;border-left:solid 10px navy;border-right:solid 10px navy;">
2424
<div id="listPanel" style="flex:0.6;overflow:auto;">
@@ -77,7 +77,6 @@
7777
<button id="btnRecord">Start Recording</button>
7878
<button id="btnPlay">play</button>
7979
<button id="btnDownloadMovie">download movie</button>
80-
<button id="btnDownloadPicture">download picture</button>
8180
<button id="btnNext">change canvas</button>
8281
</div>
8382
<div>
@@ -245,7 +244,7 @@
245244
let audioStream0 = null;
246245
let audioStream1 = null;
247246

248-
247+
console.log(navigator);
249248
var stream0 = await navigator.mediaDevices.getUserMedia({video:true,audio:true});
250249
stream0.getTracks().forEach(function(track) {
251250
track.stop();
@@ -593,19 +592,19 @@
593592
log('Recorded Blobs: '+ recordedBlobs.length);
594593
playscreen.el.controls = true;
595594
}
596-
function download() {
597-
const blob = new Blob(recordedBlobs, {type: 'video/webm'});
598-
const url = window.URL.createObjectURL(blob);
595+
async function download() {
596+
var nblob = await makeNcpBlob(recordedBlobs);
597+
const url = window.URL.createObjectURL(nblob);
599598
const a = document.createElement('a');
600599
a.style.display = 'none';
601600
a.href = url;
602-
a.download = 'test.webm';
601+
a.download = 'last_record.ncp';
603602
document.body.appendChild(a);
604603
a.click();
605604
setTimeout(() => {
606605
document.body.removeChild(a);
607606
window.URL.revokeObjectURL(url);
608-
}, 100);
607+
}, 10000);
609608
}
610609

611610
btnRecord.el.addEventListener("click",()=>{ toggleRecording(); });
@@ -698,7 +697,7 @@
698697
schema2.el.sc.scrollIntoView({block:"center"});
699698
schema2.exports.ncp.control.el.play();
700699
if( schema2.exports.ncp.spec.type == "audio.webm" ) {
701-
700+
702701
} else if(schema2.exports.ncp.spec.type == "video.webm") { // video tag, expecting bad margin, 100% width is custom
703702
schema2.exports.ncp.control.el.style.width = "100%";
704703
schema2.exports.ncp.control.el.style.marginBottom = "-7px";
@@ -731,5 +730,73 @@
731730
.send();
732731
}
733732
refresh_list();
734-
733+
734+
735+
736+
window.audio_mix = async ()=>{
737+
738+
var audio = new AudioContext();
739+
740+
// load begin
741+
var data = await fetch(`/sample.mp3`);
742+
var buffer = await data.arrayBuffer();
743+
var bufferSource = await audio.decodeAudioData(buffer);
744+
// load end
745+
746+
var mixer = audio.createMediaStreamDestination();
747+
var player = new Audio();
748+
749+
// load mic begin
750+
var micStream = await navigator.mediaDevices.getUserMedia({audio:true});
751+
// load mic end
752+
753+
var microphone = audio.createMediaStreamSource(micStream);
754+
var microphoneGain = audio.createGain();
755+
microphone.connect(microphoneGain);
756+
microphoneGain.gain.value = 0.5;
757+
758+
var playback = audio.createBufferSource();
759+
var playbackGain = audio.createGain();
760+
playback.buffer = bufferSource;
761+
playback.connect(playbackGain);
762+
playbackGain.gain.value = 0.5;
763+
764+
// play of audio playback
765+
playback.start();
766+
playbackGain.connect(audio.destination);
767+
768+
microphoneGain.connect(mixer);
769+
playbackGain.connect(mixer);
770+
// return of microphone
771+
//microphone.connect(audio.destination);
772+
773+
var mediaRecorder = new MediaRecorder(mixer.stream,{mimeType : 'audio/webm'});
774+
var chunks = [];
775+
mediaRecorder.start(1);
776+
mediaRecorder.ondataavailable = function (event) {
777+
if (event.data && event.data.size > 0) {
778+
chunks.push(event.data);
779+
}
780+
}
781+
mediaRecorder.onstop = function(event) {
782+
var player = new Audio();
783+
player.controls = "controls";
784+
var blob = new Blob(chunks, { "type": "audio/webm" });
785+
audioDownload = URL.createObjectURL(blob);
786+
var player = new Audio();
787+
player.src = audioDownload;
788+
player.play();
789+
};
790+
791+
setTimeout(()=>{
792+
micStream.getTracks().forEach(function(track) {
793+
track.stop();
794+
});
795+
playback.stop();
796+
mediaRecorder.stop();
797+
audio.close();
798+
},10000);
799+
800+
}
801+
735802
</script>

public/ncp.super

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
// expected blob of the zip
99
this.state = 1;
1010
} else {
11-
this.state = -2;
11+
this.error = new Error("must have data attribute.");
1212
}
1313
} else {
14-
this.state = -1;
14+
this.error = new Error("must have data attribute.");
1515
}
1616
this.zip = await JSZip.loadAsync(this.props.data);
1717
var result = await this.zip.file("spec.json").async("string");
@@ -25,7 +25,10 @@
2525
if( this.spec.type == "audio.webm" ) {
2626
this.ui.push(`<audio id="control" controls></audio>`)
2727
} else if(this.spec.type == "video.webm") {
28+
this.ui.push(`<div style="position:relative;">`);
2829
this.ui.push(`<video id="control" controls></video>`);
30+
this.ui.push(`<Component id="debug"></Component>`);
31+
this.ui.push(`</div>`);
2932
}
3033

3134
} else {
@@ -57,6 +60,71 @@
5760
} else if(this.spec.type == "video.webm") {
5861
var content_blob = await this.zip.file("data.webm").async("blob");
5962
control.el.src = window.URL.createObjectURL(content_blob);
63+
var schema1 = await debug.$.elementPushPacketAsync(`
64+
<Component id="prompt"></Component>
65+
<div style="display:none;">
66+
<div style="height:30px;"></div>
67+
<div style="display:flex;">
68+
<div>duration</div>
69+
<div id="lblDuration"></div>
70+
</div>
71+
<div style="display:flex;">
72+
<div>current</div>
73+
<div id="lblCurrent"></div>
74+
</div>
75+
</div>
76+
`);
77+
control.el.addEventListener("playing",async (e)=>{
78+
schema1.$.prompt.elementsClear();
79+
});
80+
control.el.addEventListener("timeupdate",async (e)=>{
81+
//if(e.target.currentTime == 0) {
82+
// schema1.$.prompt.elementsClear();
83+
//}
84+
//schema1.$.lblDuration.elementSetPacketAsync(""+e.target.duration);
85+
//schema1.$.lblCurrent.elementSetPacketAsync(""+e.target.currentTime);
86+
if(e.target.duration == e.target.currentTime) {
87+
var schema2 = await schema1.$.prompt.elementSetPacketAsync(`
88+
<div id="overlay" style="position:absolute;left:0px;top:0px;background-image: linear-gradient(to bottom, rgba(0,0,0,0), rgba(0,0,0,1));">
89+
<div style="padding:40px;padding-bottom:5px;display:flex;">
90+
<div id="btnLike" style="flex:1;border:solid 1px #000;margin-right:10px;background-color:white;color:black;cursor:pointer;">Gostei</div>
91+
<div id="btnDislike" style="flex:1;border:solid 1px #000;background-color:white;color:black;cursor:pointer;">Não Gostei</div>
92+
</div>
93+
<div style="padding:40px;padding-top:5px;display:flex;">
94+
<div id="btnContact" style="flex:1;border:solid 1px #000;background-color:white;color:black;cursor:pointer;">Entrar em contato</div>
95+
</div>
96+
</div>
97+
`);
98+
schema2.el.overlay.style.width = control.el.offsetWidth + 'px';
99+
schema2.el.overlay.style.height = control.el.offsetHeight + 'px';
100+
schema2.el.btnLike.addEventListener("mouseover",()=>{
101+
schema2.el.btnLike.style.backgroundColor = "black";
102+
schema2.el.btnLike.style.color = "white";
103+
});
104+
schema2.el.btnLike.addEventListener("mouseout",()=>{
105+
schema2.el.btnLike.style.backgroundColor = "white";
106+
schema2.el.btnLike.style.color = "black";
107+
});
108+
schema2.el.btnDislike.addEventListener("mouseover",()=>{
109+
schema2.el.btnDislike.style.backgroundColor = "black";
110+
schema2.el.btnDislike.style.color = "white";
111+
});
112+
schema2.el.btnDislike.addEventListener("mouseout",()=>{
113+
schema2.el.btnDislike.style.backgroundColor = "white";
114+
schema2.el.btnDislike.style.color = "black";
115+
});
116+
schema2.el.btnContact.addEventListener("mouseover",()=>{
117+
schema2.el.btnContact.style.backgroundColor = "black";
118+
schema2.el.btnContact.style.color = "white";
119+
});
120+
schema2.el.btnContact.addEventListener("mouseout",()=>{
121+
schema2.el.btnContact.style.backgroundColor = "white";
122+
schema2.el.btnContact.style.color = "black";
123+
});
124+
//control.$.emit("end");
125+
}
126+
})
127+
//vid.duration
60128
}
61129
}
62130
}

server.cert

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIID2jCCAsKgAwIBAgIUacpZTakotsGPSa+XTfBxzAl1rL4wDQYJKoZIhvcNAQEL
3+
BQAwfjELMAkGA1UEBhMCQlIxCzAJBgNVBAgMAlNQMRUwEwYDVQQHDAxTw4PCo28g
4+
UGF1bG8xFTATBgNVBAoMDE51bWJlckNvb2xlcjESMBAGA1UECwwJQWxwaGFUZXN0
5+
MSAwHgYJKoZIhvcNAQkBFhFmc2gua29kQGdtYWlsLmNvbTAeFw0yMDA3MTExODUw
6+
MjZaFw0yMDA4MTAxODUwMjZaMH4xCzAJBgNVBAYTAkJSMQswCQYDVQQIDAJTUDEV
7+
MBMGA1UEBwwMU8ODwqNvIFBhdWxvMRUwEwYDVQQKDAxOdW1iZXJDb29sZXIxEjAQ
8+
BgNVBAsMCUFscGhhVGVzdDEgMB4GCSqGSIb3DQEJARYRZnNoLmtvZEBnbWFpbC5j
9+
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7bCCm+Oq0/86lZMFt
10+
uatUDFV/9wUDePMPQ1VDbZE5uHlf7GHum5CH+mBRqeDVIS4z7y67q/LrdvPirtuV
11+
CjbgYvCrIedb9v+7GF4lWoo3zKM4T7XVUX1RBL5699Q1XVXiusUCGur/kg7TBT46
12+
TIWlamhSRYM6UMoRyrCkt8GTaNZwWQ2lxZ0PG1Kasj3Q2KYz9oXfhPOrUUZLkogT
13+
r+WUMQvy9KLYxv0m799XUeFbY8d24KLqLvZfy91xmJHVAN5xPa9sqJzmXqTb1gKz
14+
1t+WTYm4LlDKCdQnvpNEFWrlZgy6PiKZjZEZ2ZnAGwHe2OCj1TMQAX/JGpnqyCet
15+
kfyTAgMBAAGjUDBOMB0GA1UdDgQWBBSQxmBacos0OGgKZZX2HMgKJrxYGTAfBgNV
16+
HSMEGDAWgBSQxmBacos0OGgKZZX2HMgKJrxYGTAMBgNVHRMEBTADAQH/MA0GCSqG
17+
SIb3DQEBCwUAA4IBAQC1vl5Zo11SKoTSpBIelX8Rhq7W1cXgNVVU7Y3hySF8BygD
18+
nO0RCHbk0HLU3QXWVGU6pGBf5uy+zS1v1Ghkb+bLks9vcUtDl12oBbBfZQZ2sRXK
19+
HtSk8XhSSLrRClmAfLB+TPrH6mHqpGMft86FIQ8f2Tc2gb8+sEtlF6+5FjiqSwuk
20+
P1VwHdiSDCQesN3PdKskfuJGK6F/c1d3zbNlrv5gCO6rF0Rmz4FjCZew/LgQkCbY
21+
bydfvqfyCiVNdhaJQN6XU4qJ5tBogzubiMgIy+C+JaxiDuKJ90CdCNYra4rrNZ1c
22+
7dTWuLGPQwv1qAA45X8GPuHhiOdeacC7VPcw2BHQ
23+
-----END CERTIFICATE-----

server.key

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7bCCm+Oq0/86l
3+
ZMFtuatUDFV/9wUDePMPQ1VDbZE5uHlf7GHum5CH+mBRqeDVIS4z7y67q/LrdvPi
4+
rtuVCjbgYvCrIedb9v+7GF4lWoo3zKM4T7XVUX1RBL5699Q1XVXiusUCGur/kg7T
5+
BT46TIWlamhSRYM6UMoRyrCkt8GTaNZwWQ2lxZ0PG1Kasj3Q2KYz9oXfhPOrUUZL
6+
kogTr+WUMQvy9KLYxv0m799XUeFbY8d24KLqLvZfy91xmJHVAN5xPa9sqJzmXqTb
7+
1gKz1t+WTYm4LlDKCdQnvpNEFWrlZgy6PiKZjZEZ2ZnAGwHe2OCj1TMQAX/JGpnq
8+
yCetkfyTAgMBAAECggEBAK1ozQlQk/DmIm+7OpDoUlIQm2crybK9zL4ZgaFCljT+
9+
ryaGktHvk5mMmmPUtxbbfWFF80pnPPqJ8/uP59ENQ1r3kE/2rZbUgSa91BXhoLMi
10+
Hv6yGb6GiFlW91rVRL4fXqDKSA+7kiTnIdozJrFQLfOv8Vf1wwZIy74MeMXe0zcs
11+
GeQrSXI+J2O7tpf6vf6ZwNOfIvd7oIlqiMfr55mx7P9Dc0+cXUgOX/WM1OJUCbUN
12+
L2zdEaqMqPrMyxKQDPgCz52C4d1nzLgsmsM0qiKEB0dEotGOQ+7v0tUpRefzauUA
13+
osZ6gWLit6XVZUx+IBryFgMuRxvaXjtc6HE2lPqdH+kCgYEA6SFuMuJWELPmR70P
14+
d/z9EadyOEihdhCyOzzbD0P515myZwIAr3fPNiAR12dYvLzxE7Vq1lR3y63L2HJk
15+
xJL2PbS5Z13kPD7ikRr6HPm8w0Mk15dRYGWYsNa/dcBvBF7bZxG7XsWM5bpVTZta
16+
CrPEcQr9xXsdFN4+bWYfyr+wap0CgYEAzc7VliXT2A3vMM33lvja1d4hI04Vqsx0
17+
o133XPUTlAVxvFajLtvLo1PE41mnnntrfCqdo3LjW9tUI+ue9EWTfS7RHP1LV0k8
18+
HuZbCFY99Hk9iNND4vugkkQ7xBpjvPuh2NoS9m8JaR4MZ6l6dDXodhw3NTPZ5Gkc
19+
CMrc1M7EBO8CgYB/n3p5RqiA6ksFOL2QHSHZGUaRA0nInWlEvpLZb4gFfDFK7LC9
20+
XiREaBf8SKouYGzFMkpzXLhb+x+dtTnu1tkQfLAGo0K/rFlRwGftltW8OzSfBUpa
21+
MCP/owAbESZ1SQxpBy8AubrhRDlQi9wmAbVngPHduwD3nJamQwLidj+4jQKBgB0B
22+
DTC/2/8S16a1IDNylsSVLW5gTsVnUvjDAV1kXIH70m+MdirgZu55m8G+nNTE5/zz
23+
tIuYYVpMqqr1Rc1/EK4PrwC64adHduWT6ThfjxOpEnb57xNKCvMSEqosXeoAPGrn
24+
MMzyEQ1zYqQpSkyeXEho6Y7h489A0OacUErdaNqZAoGAP8LodbY9+17RYmbo8khQ
25+
/LBf+DB3X+atu0XNOkQwpS0W+NI9a7QuXrU0wZCc9Pj5sN8NizGgNmdYPQRwa4vC
26+
+NrJxfMCB5v5y0KMK4XDk8dsW6taR0Gurjr2cARVbllf1lc1kARKCwvFHsq++SAs
27+
IHIc2C/0pRuC2t9AIrsnKA4=
28+
-----END PRIVATE KEY-----

0 commit comments

Comments
 (0)