jbilcke-hf HF staff commited on
Commit
07ae658
·
0 Parent(s):

initial commit

Browse files
.dockerignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ node_modules
2
+ npm-debug.log
3
+ models
4
+ sandbox
5
+ audio.pipe
6
+ video.pipe
.gitignore ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ node_modules
2
+ *.log
3
+ *.bin
4
+ .DS_Store
5
+ .venv
6
+ models/
7
+ sandbox/
8
+ audio.pipe
9
+ video.pipe
.nvmrc ADDED
@@ -0,0 +1 @@
 
 
1
+ v18.16.0
Dockerfile ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM node:18
2
+
3
+
4
+ ARG DEBIAN_FRONTEND=noninteractive
5
+
6
+ RUN apt update
7
+
8
+ RUN apt --yes install ffmpeg
9
+
10
+ # Set up a new user named "user" with user ID 1000
11
+ RUN useradd -o -u 1000 user
12
+
13
+ # Switch to the "user" user
14
+ USER user
15
+
16
+ # Set home to the user's home directory
17
+ ENV HOME=/home/user \
18
+ PATH=/home/user/.local/bin:$PATH
19
+
20
+ # Set the working directory to the user's home directory
21
+ WORKDIR $HOME/app
22
+
23
+ # Install app dependencies
24
+ # A wildcard is used to ensure both package.json AND package-lock.json are copied
25
+ # where available (npm@5+)
26
+ COPY --chown=user package*.json $HOME/app
27
+
28
+ RUN npm install
29
+
30
+ # Copy the current directory contents into the container at $HOME/app setting the owner to the user
31
+ COPY --chown=user . $HOME/app
32
+
33
+ EXPOSE 8000
34
+
35
+ CMD [ "bash", "start.sh" ]
LICENSE.txt ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
README.md ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Media Server
3
+ emoji: 📡
4
+ colorFrom: gray
5
+ colorTo: black
6
+ sdk: docker
7
+ pinned: false
8
+ app_port: 8000
9
+ ---
10
+
11
+ Media server 📡
media-server.js ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const NodeMediaServer = require('node-media-server')
2
+
3
+ const config = {
4
+ auth: {
5
+ api: true,
6
+ api_user: process.env.WEBTV_MEDIA_SERVER_USER,
7
+ api_pass: process.env.WEBTV_MEDIA_SERVER_PASSWORD
8
+ },
9
+ rtmp: {
10
+ port: 1935,
11
+ chunk_size: 60000,
12
+ gop_cache: true,
13
+ ping: 30,
14
+ ping_timeout: 60
15
+ },
16
+ http: {
17
+ port: 8000,
18
+ allow_origin: '*'
19
+ }
20
+ };
21
+
22
+ console.log("starting the RTMP server..")
23
+ var nms = new NodeMediaServer(config)
24
+ nms.run()
package-lock.json ADDED
@@ -0,0 +1,1135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "media-server",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "media-server",
9
+ "version": "1.0.0",
10
+ "license": "Apache License",
11
+ "dependencies": {
12
+ "@gradio/client": "^0.1.3",
13
+ "@huggingface/inference": "^2.5.2",
14
+ "@types/express": "^4.17.17",
15
+ "node-fetch": "^3.3.1",
16
+ "node-media-server": "^2.6.2",
17
+ "ts-node": "^10.9.1"
18
+ }
19
+ },
20
+ "node_modules/@cspotcode/source-map-support": {
21
+ "version": "0.8.1",
22
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
23
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
24
+ "dependencies": {
25
+ "@jridgewell/trace-mapping": "0.3.9"
26
+ },
27
+ "engines": {
28
+ "node": ">=12"
29
+ }
30
+ },
31
+ "node_modules/@gradio/client": {
32
+ "version": "0.1.4",
33
+ "resolved": "https://registry.npmjs.org/@gradio/client/-/client-0.1.4.tgz",
34
+ "integrity": "sha512-iGu5PYpqOG6jq0l3+XoB8JCQ4ppoXSSb4T9IK2i1JckY2WXVW/x/MCVTc8WTouyu6o0h46shGWSjMSBr9Xnlug==",
35
+ "dependencies": {
36
+ "bufferutil": "^4.0.7",
37
+ "semiver": "^1.1.0",
38
+ "ws": "^8.13.0"
39
+ },
40
+ "engines": {
41
+ "node": ">=18.0.0"
42
+ }
43
+ },
44
+ "node_modules/@huggingface/inference": {
45
+ "version": "2.5.2",
46
+ "resolved": "https://registry.npmjs.org/@huggingface/inference/-/inference-2.5.2.tgz",
47
+ "integrity": "sha512-v2f4mRgumisTOkelYPCZQRBzh5K0l2vexH8b88CevWv+KgzeC0oPeQhDiSNisCpE6hK+UC6KQ/FxF265kcd6FA==",
48
+ "engines": {
49
+ "node": ">=18"
50
+ }
51
+ },
52
+ "node_modules/@jridgewell/resolve-uri": {
53
+ "version": "3.1.1",
54
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
55
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
56
+ "engines": {
57
+ "node": ">=6.0.0"
58
+ }
59
+ },
60
+ "node_modules/@jridgewell/sourcemap-codec": {
61
+ "version": "1.4.15",
62
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
63
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
64
+ },
65
+ "node_modules/@jridgewell/trace-mapping": {
66
+ "version": "0.3.9",
67
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
68
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
69
+ "dependencies": {
70
+ "@jridgewell/resolve-uri": "^3.0.3",
71
+ "@jridgewell/sourcemap-codec": "^1.4.10"
72
+ }
73
+ },
74
+ "node_modules/@tsconfig/node10": {
75
+ "version": "1.0.9",
76
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
77
+ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA=="
78
+ },
79
+ "node_modules/@tsconfig/node12": {
80
+ "version": "1.0.11",
81
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
82
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="
83
+ },
84
+ "node_modules/@tsconfig/node14": {
85
+ "version": "1.0.3",
86
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
87
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="
88
+ },
89
+ "node_modules/@tsconfig/node16": {
90
+ "version": "1.0.4",
91
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
92
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="
93
+ },
94
+ "node_modules/@types/body-parser": {
95
+ "version": "1.19.2",
96
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
97
+ "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
98
+ "dependencies": {
99
+ "@types/connect": "*",
100
+ "@types/node": "*"
101
+ }
102
+ },
103
+ "node_modules/@types/connect": {
104
+ "version": "3.4.35",
105
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
106
+ "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
107
+ "dependencies": {
108
+ "@types/node": "*"
109
+ }
110
+ },
111
+ "node_modules/@types/express": {
112
+ "version": "4.17.17",
113
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
114
+ "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
115
+ "dependencies": {
116
+ "@types/body-parser": "*",
117
+ "@types/express-serve-static-core": "^4.17.33",
118
+ "@types/qs": "*",
119
+ "@types/serve-static": "*"
120
+ }
121
+ },
122
+ "node_modules/@types/express-serve-static-core": {
123
+ "version": "4.17.35",
124
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz",
125
+ "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==",
126
+ "dependencies": {
127
+ "@types/node": "*",
128
+ "@types/qs": "*",
129
+ "@types/range-parser": "*",
130
+ "@types/send": "*"
131
+ }
132
+ },
133
+ "node_modules/@types/http-errors": {
134
+ "version": "2.0.1",
135
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz",
136
+ "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ=="
137
+ },
138
+ "node_modules/@types/mime": {
139
+ "version": "1.3.2",
140
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
141
+ "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw=="
142
+ },
143
+ "node_modules/@types/node": {
144
+ "version": "20.3.2",
145
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.2.tgz",
146
+ "integrity": "sha512-vOBLVQeCQfIcF/2Y7eKFTqrMnizK5lRNQ7ykML/5RuwVXVWxYkgwS7xbt4B6fKCUPgbSL5FSsjHQpaGQP/dQmw=="
147
+ },
148
+ "node_modules/@types/qs": {
149
+ "version": "6.9.7",
150
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
151
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
152
+ },
153
+ "node_modules/@types/range-parser": {
154
+ "version": "1.2.4",
155
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
156
+ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
157
+ },
158
+ "node_modules/@types/send": {
159
+ "version": "0.17.1",
160
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz",
161
+ "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==",
162
+ "dependencies": {
163
+ "@types/mime": "^1",
164
+ "@types/node": "*"
165
+ }
166
+ },
167
+ "node_modules/@types/serve-static": {
168
+ "version": "1.15.2",
169
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz",
170
+ "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==",
171
+ "dependencies": {
172
+ "@types/http-errors": "*",
173
+ "@types/mime": "*",
174
+ "@types/node": "*"
175
+ }
176
+ },
177
+ "node_modules/accepts": {
178
+ "version": "1.3.8",
179
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
180
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
181
+ "dependencies": {
182
+ "mime-types": "~2.1.34",
183
+ "negotiator": "0.6.3"
184
+ },
185
+ "engines": {
186
+ "node": ">= 0.6"
187
+ }
188
+ },
189
+ "node_modules/acorn": {
190
+ "version": "8.9.0",
191
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz",
192
+ "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==",
193
+ "bin": {
194
+ "acorn": "bin/acorn"
195
+ },
196
+ "engines": {
197
+ "node": ">=0.4.0"
198
+ }
199
+ },
200
+ "node_modules/acorn-walk": {
201
+ "version": "8.2.0",
202
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
203
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
204
+ "engines": {
205
+ "node": ">=0.4.0"
206
+ }
207
+ },
208
+ "node_modules/ansi-styles": {
209
+ "version": "4.3.0",
210
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
211
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
212
+ "dependencies": {
213
+ "color-convert": "^2.0.1"
214
+ },
215
+ "engines": {
216
+ "node": ">=8"
217
+ },
218
+ "funding": {
219
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
220
+ }
221
+ },
222
+ "node_modules/arg": {
223
+ "version": "4.1.3",
224
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
225
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
226
+ },
227
+ "node_modules/array-flatten": {
228
+ "version": "1.1.1",
229
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
230
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
231
+ },
232
+ "node_modules/basic-auth-connect": {
233
+ "version": "1.0.0",
234
+ "resolved": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz",
235
+ "integrity": "sha512-kiV+/DTgVro4aZifY/hwRwALBISViL5NP4aReaR2EVJEObpbUBHIkdJh/YpcoEiYt7nBodZ6U2ajZeZvSxUCCg=="
236
+ },
237
+ "node_modules/body-parser": {
238
+ "version": "1.20.1",
239
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
240
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
241
+ "dependencies": {
242
+ "bytes": "3.1.2",
243
+ "content-type": "~1.0.4",
244
+ "debug": "2.6.9",
245
+ "depd": "2.0.0",
246
+ "destroy": "1.2.0",
247
+ "http-errors": "2.0.0",
248
+ "iconv-lite": "0.4.24",
249
+ "on-finished": "2.4.1",
250
+ "qs": "6.11.0",
251
+ "raw-body": "2.5.1",
252
+ "type-is": "~1.6.18",
253
+ "unpipe": "1.0.0"
254
+ },
255
+ "engines": {
256
+ "node": ">= 0.8",
257
+ "npm": "1.2.8000 || >= 1.4.16"
258
+ }
259
+ },
260
+ "node_modules/bufferutil": {
261
+ "version": "4.0.7",
262
+ "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz",
263
+ "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==",
264
+ "hasInstallScript": true,
265
+ "dependencies": {
266
+ "node-gyp-build": "^4.3.0"
267
+ },
268
+ "engines": {
269
+ "node": ">=6.14.2"
270
+ }
271
+ },
272
+ "node_modules/bytes": {
273
+ "version": "3.1.2",
274
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
275
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
276
+ "engines": {
277
+ "node": ">= 0.8"
278
+ }
279
+ },
280
+ "node_modules/call-bind": {
281
+ "version": "1.0.2",
282
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
283
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
284
+ "dependencies": {
285
+ "function-bind": "^1.1.1",
286
+ "get-intrinsic": "^1.0.2"
287
+ },
288
+ "funding": {
289
+ "url": "https://github.com/sponsors/ljharb"
290
+ }
291
+ },
292
+ "node_modules/chalk": {
293
+ "version": "4.1.2",
294
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
295
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
296
+ "dependencies": {
297
+ "ansi-styles": "^4.1.0",
298
+ "supports-color": "^7.1.0"
299
+ },
300
+ "engines": {
301
+ "node": ">=10"
302
+ },
303
+ "funding": {
304
+ "url": "https://github.com/chalk/chalk?sponsor=1"
305
+ }
306
+ },
307
+ "node_modules/color-convert": {
308
+ "version": "2.0.1",
309
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
310
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
311
+ "dependencies": {
312
+ "color-name": "~1.1.4"
313
+ },
314
+ "engines": {
315
+ "node": ">=7.0.0"
316
+ }
317
+ },
318
+ "node_modules/color-name": {
319
+ "version": "1.1.4",
320
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
321
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
322
+ },
323
+ "node_modules/content-disposition": {
324
+ "version": "0.5.4",
325
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
326
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
327
+ "dependencies": {
328
+ "safe-buffer": "5.2.1"
329
+ },
330
+ "engines": {
331
+ "node": ">= 0.6"
332
+ }
333
+ },
334
+ "node_modules/content-type": {
335
+ "version": "1.0.5",
336
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
337
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
338
+ "engines": {
339
+ "node": ">= 0.6"
340
+ }
341
+ },
342
+ "node_modules/cookie": {
343
+ "version": "0.5.0",
344
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
345
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
346
+ "engines": {
347
+ "node": ">= 0.6"
348
+ }
349
+ },
350
+ "node_modules/cookie-signature": {
351
+ "version": "1.0.6",
352
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
353
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
354
+ },
355
+ "node_modules/create-require": {
356
+ "version": "1.1.1",
357
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
358
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="
359
+ },
360
+ "node_modules/data-uri-to-buffer": {
361
+ "version": "4.0.1",
362
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
363
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
364
+ "engines": {
365
+ "node": ">= 12"
366
+ }
367
+ },
368
+ "node_modules/dateformat": {
369
+ "version": "4.6.3",
370
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz",
371
+ "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==",
372
+ "engines": {
373
+ "node": "*"
374
+ }
375
+ },
376
+ "node_modules/debug": {
377
+ "version": "2.6.9",
378
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
379
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
380
+ "dependencies": {
381
+ "ms": "2.0.0"
382
+ }
383
+ },
384
+ "node_modules/depd": {
385
+ "version": "2.0.0",
386
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
387
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
388
+ "engines": {
389
+ "node": ">= 0.8"
390
+ }
391
+ },
392
+ "node_modules/destroy": {
393
+ "version": "1.2.0",
394
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
395
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
396
+ "engines": {
397
+ "node": ">= 0.8",
398
+ "npm": "1.2.8000 || >= 1.4.16"
399
+ }
400
+ },
401
+ "node_modules/diff": {
402
+ "version": "4.0.2",
403
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
404
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
405
+ "engines": {
406
+ "node": ">=0.3.1"
407
+ }
408
+ },
409
+ "node_modules/ee-first": {
410
+ "version": "1.1.1",
411
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
412
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
413
+ },
414
+ "node_modules/encodeurl": {
415
+ "version": "1.0.2",
416
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
417
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
418
+ "engines": {
419
+ "node": ">= 0.8"
420
+ }
421
+ },
422
+ "node_modules/escape-html": {
423
+ "version": "1.0.3",
424
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
425
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
426
+ },
427
+ "node_modules/etag": {
428
+ "version": "1.8.1",
429
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
430
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
431
+ "engines": {
432
+ "node": ">= 0.6"
433
+ }
434
+ },
435
+ "node_modules/express": {
436
+ "version": "4.18.2",
437
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
438
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
439
+ "dependencies": {
440
+ "accepts": "~1.3.8",
441
+ "array-flatten": "1.1.1",
442
+ "body-parser": "1.20.1",
443
+ "content-disposition": "0.5.4",
444
+ "content-type": "~1.0.4",
445
+ "cookie": "0.5.0",
446
+ "cookie-signature": "1.0.6",
447
+ "debug": "2.6.9",
448
+ "depd": "2.0.0",
449
+ "encodeurl": "~1.0.2",
450
+ "escape-html": "~1.0.3",
451
+ "etag": "~1.8.1",
452
+ "finalhandler": "1.2.0",
453
+ "fresh": "0.5.2",
454
+ "http-errors": "2.0.0",
455
+ "merge-descriptors": "1.0.1",
456
+ "methods": "~1.1.2",
457
+ "on-finished": "2.4.1",
458
+ "parseurl": "~1.3.3",
459
+ "path-to-regexp": "0.1.7",
460
+ "proxy-addr": "~2.0.7",
461
+ "qs": "6.11.0",
462
+ "range-parser": "~1.2.1",
463
+ "safe-buffer": "5.2.1",
464
+ "send": "0.18.0",
465
+ "serve-static": "1.15.0",
466
+ "setprototypeof": "1.2.0",
467
+ "statuses": "2.0.1",
468
+ "type-is": "~1.6.18",
469
+ "utils-merge": "1.0.1",
470
+ "vary": "~1.1.2"
471
+ },
472
+ "engines": {
473
+ "node": ">= 0.10.0"
474
+ }
475
+ },
476
+ "node_modules/fetch-blob": {
477
+ "version": "3.2.0",
478
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
479
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
480
+ "funding": [
481
+ {
482
+ "type": "github",
483
+ "url": "https://github.com/sponsors/jimmywarting"
484
+ },
485
+ {
486
+ "type": "paypal",
487
+ "url": "https://paypal.me/jimmywarting"
488
+ }
489
+ ],
490
+ "dependencies": {
491
+ "node-domexception": "^1.0.0",
492
+ "web-streams-polyfill": "^3.0.3"
493
+ },
494
+ "engines": {
495
+ "node": "^12.20 || >= 14.13"
496
+ }
497
+ },
498
+ "node_modules/finalhandler": {
499
+ "version": "1.2.0",
500
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
501
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
502
+ "dependencies": {
503
+ "debug": "2.6.9",
504
+ "encodeurl": "~1.0.2",
505
+ "escape-html": "~1.0.3",
506
+ "on-finished": "2.4.1",
507
+ "parseurl": "~1.3.3",
508
+ "statuses": "2.0.1",
509
+ "unpipe": "~1.0.0"
510
+ },
511
+ "engines": {
512
+ "node": ">= 0.8"
513
+ }
514
+ },
515
+ "node_modules/formdata-polyfill": {
516
+ "version": "4.0.10",
517
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
518
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
519
+ "dependencies": {
520
+ "fetch-blob": "^3.1.2"
521
+ },
522
+ "engines": {
523
+ "node": ">=12.20.0"
524
+ }
525
+ },
526
+ "node_modules/forwarded": {
527
+ "version": "0.2.0",
528
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
529
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
530
+ "engines": {
531
+ "node": ">= 0.6"
532
+ }
533
+ },
534
+ "node_modules/fresh": {
535
+ "version": "0.5.2",
536
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
537
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
538
+ "engines": {
539
+ "node": ">= 0.6"
540
+ }
541
+ },
542
+ "node_modules/function-bind": {
543
+ "version": "1.1.1",
544
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
545
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
546
+ },
547
+ "node_modules/get-intrinsic": {
548
+ "version": "1.2.1",
549
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
550
+ "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
551
+ "dependencies": {
552
+ "function-bind": "^1.1.1",
553
+ "has": "^1.0.3",
554
+ "has-proto": "^1.0.1",
555
+ "has-symbols": "^1.0.3"
556
+ },
557
+ "funding": {
558
+ "url": "https://github.com/sponsors/ljharb"
559
+ }
560
+ },
561
+ "node_modules/has": {
562
+ "version": "1.0.3",
563
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
564
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
565
+ "dependencies": {
566
+ "function-bind": "^1.1.1"
567
+ },
568
+ "engines": {
569
+ "node": ">= 0.4.0"
570
+ }
571
+ },
572
+ "node_modules/has-flag": {
573
+ "version": "4.0.0",
574
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
575
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
576
+ "engines": {
577
+ "node": ">=8"
578
+ }
579
+ },
580
+ "node_modules/has-proto": {
581
+ "version": "1.0.1",
582
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
583
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
584
+ "engines": {
585
+ "node": ">= 0.4"
586
+ },
587
+ "funding": {
588
+ "url": "https://github.com/sponsors/ljharb"
589
+ }
590
+ },
591
+ "node_modules/has-symbols": {
592
+ "version": "1.0.3",
593
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
594
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
595
+ "engines": {
596
+ "node": ">= 0.4"
597
+ },
598
+ "funding": {
599
+ "url": "https://github.com/sponsors/ljharb"
600
+ }
601
+ },
602
+ "node_modules/http-errors": {
603
+ "version": "2.0.0",
604
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
605
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
606
+ "dependencies": {
607
+ "depd": "2.0.0",
608
+ "inherits": "2.0.4",
609
+ "setprototypeof": "1.2.0",
610
+ "statuses": "2.0.1",
611
+ "toidentifier": "1.0.1"
612
+ },
613
+ "engines": {
614
+ "node": ">= 0.8"
615
+ }
616
+ },
617
+ "node_modules/iconv-lite": {
618
+ "version": "0.4.24",
619
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
620
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
621
+ "dependencies": {
622
+ "safer-buffer": ">= 2.1.2 < 3"
623
+ },
624
+ "engines": {
625
+ "node": ">=0.10.0"
626
+ }
627
+ },
628
+ "node_modules/inherits": {
629
+ "version": "2.0.4",
630
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
631
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
632
+ },
633
+ "node_modules/ipaddr.js": {
634
+ "version": "1.9.1",
635
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
636
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
637
+ "engines": {
638
+ "node": ">= 0.10"
639
+ }
640
+ },
641
+ "node_modules/lodash": {
642
+ "version": "4.17.21",
643
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
644
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
645
+ },
646
+ "node_modules/make-error": {
647
+ "version": "1.3.6",
648
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
649
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
650
+ },
651
+ "node_modules/media-typer": {
652
+ "version": "0.3.0",
653
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
654
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
655
+ "engines": {
656
+ "node": ">= 0.6"
657
+ }
658
+ },
659
+ "node_modules/merge-descriptors": {
660
+ "version": "1.0.1",
661
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
662
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
663
+ },
664
+ "node_modules/methods": {
665
+ "version": "1.1.2",
666
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
667
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
668
+ "engines": {
669
+ "node": ">= 0.6"
670
+ }
671
+ },
672
+ "node_modules/mime": {
673
+ "version": "1.6.0",
674
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
675
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
676
+ "bin": {
677
+ "mime": "cli.js"
678
+ },
679
+ "engines": {
680
+ "node": ">=4"
681
+ }
682
+ },
683
+ "node_modules/mime-db": {
684
+ "version": "1.52.0",
685
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
686
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
687
+ "engines": {
688
+ "node": ">= 0.6"
689
+ }
690
+ },
691
+ "node_modules/mime-types": {
692
+ "version": "2.1.35",
693
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
694
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
695
+ "dependencies": {
696
+ "mime-db": "1.52.0"
697
+ },
698
+ "engines": {
699
+ "node": ">= 0.6"
700
+ }
701
+ },
702
+ "node_modules/minimist": {
703
+ "version": "1.2.8",
704
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
705
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
706
+ "funding": {
707
+ "url": "https://github.com/sponsors/ljharb"
708
+ }
709
+ },
710
+ "node_modules/mkdirp": {
711
+ "version": "2.1.6",
712
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz",
713
+ "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==",
714
+ "bin": {
715
+ "mkdirp": "dist/cjs/src/bin.js"
716
+ },
717
+ "engines": {
718
+ "node": ">=10"
719
+ },
720
+ "funding": {
721
+ "url": "https://github.com/sponsors/isaacs"
722
+ }
723
+ },
724
+ "node_modules/ms": {
725
+ "version": "2.0.0",
726
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
727
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
728
+ },
729
+ "node_modules/negotiator": {
730
+ "version": "0.6.3",
731
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
732
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
733
+ "engines": {
734
+ "node": ">= 0.6"
735
+ }
736
+ },
737
+ "node_modules/node-domexception": {
738
+ "version": "1.0.0",
739
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
740
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
741
+ "funding": [
742
+ {
743
+ "type": "github",
744
+ "url": "https://github.com/sponsors/jimmywarting"
745
+ },
746
+ {
747
+ "type": "github",
748
+ "url": "https://paypal.me/jimmywarting"
749
+ }
750
+ ],
751
+ "engines": {
752
+ "node": ">=10.5.0"
753
+ }
754
+ },
755
+ "node_modules/node-fetch": {
756
+ "version": "3.3.1",
757
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz",
758
+ "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==",
759
+ "dependencies": {
760
+ "data-uri-to-buffer": "^4.0.0",
761
+ "fetch-blob": "^3.1.4",
762
+ "formdata-polyfill": "^4.0.10"
763
+ },
764
+ "engines": {
765
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
766
+ },
767
+ "funding": {
768
+ "type": "opencollective",
769
+ "url": "https://opencollective.com/node-fetch"
770
+ }
771
+ },
772
+ "node_modules/node-gyp-build": {
773
+ "version": "4.6.0",
774
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz",
775
+ "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==",
776
+ "bin": {
777
+ "node-gyp-build": "bin.js",
778
+ "node-gyp-build-optional": "optional.js",
779
+ "node-gyp-build-test": "build-test.js"
780
+ }
781
+ },
782
+ "node_modules/node-media-server": {
783
+ "version": "2.6.2",
784
+ "resolved": "https://registry.npmjs.org/node-media-server/-/node-media-server-2.6.2.tgz",
785
+ "integrity": "sha512-k/fsilAMh3G8P2hj11mp8gj5i5eXy7QrbY0CZUwQxVc0fHalIEIfSrxFzK2kP38XaEwOCmQlFS5zj5/JGQvl8A==",
786
+ "dependencies": {
787
+ "basic-auth-connect": "^1.0.0",
788
+ "chalk": "^4.1.0",
789
+ "dateformat": "^4.6.3",
790
+ "express": "^4.18.2",
791
+ "lodash": "^4.17.21",
792
+ "minimist": "^1.2.8",
793
+ "mkdirp": "^2.1.5",
794
+ "ws": "^8.13.0"
795
+ },
796
+ "bin": {
797
+ "node-media-server": "bin/app.js"
798
+ },
799
+ "engines": {
800
+ "node": ">=8.0.0"
801
+ }
802
+ },
803
+ "node_modules/object-inspect": {
804
+ "version": "1.12.3",
805
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
806
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
807
+ "funding": {
808
+ "url": "https://github.com/sponsors/ljharb"
809
+ }
810
+ },
811
+ "node_modules/on-finished": {
812
+ "version": "2.4.1",
813
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
814
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
815
+ "dependencies": {
816
+ "ee-first": "1.1.1"
817
+ },
818
+ "engines": {
819
+ "node": ">= 0.8"
820
+ }
821
+ },
822
+ "node_modules/parseurl": {
823
+ "version": "1.3.3",
824
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
825
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
826
+ "engines": {
827
+ "node": ">= 0.8"
828
+ }
829
+ },
830
+ "node_modules/path-to-regexp": {
831
+ "version": "0.1.7",
832
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
833
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
834
+ },
835
+ "node_modules/proxy-addr": {
836
+ "version": "2.0.7",
837
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
838
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
839
+ "dependencies": {
840
+ "forwarded": "0.2.0",
841
+ "ipaddr.js": "1.9.1"
842
+ },
843
+ "engines": {
844
+ "node": ">= 0.10"
845
+ }
846
+ },
847
+ "node_modules/qs": {
848
+ "version": "6.11.0",
849
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
850
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
851
+ "dependencies": {
852
+ "side-channel": "^1.0.4"
853
+ },
854
+ "engines": {
855
+ "node": ">=0.6"
856
+ },
857
+ "funding": {
858
+ "url": "https://github.com/sponsors/ljharb"
859
+ }
860
+ },
861
+ "node_modules/range-parser": {
862
+ "version": "1.2.1",
863
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
864
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
865
+ "engines": {
866
+ "node": ">= 0.6"
867
+ }
868
+ },
869
+ "node_modules/raw-body": {
870
+ "version": "2.5.1",
871
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
872
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
873
+ "dependencies": {
874
+ "bytes": "3.1.2",
875
+ "http-errors": "2.0.0",
876
+ "iconv-lite": "0.4.24",
877
+ "unpipe": "1.0.0"
878
+ },
879
+ "engines": {
880
+ "node": ">= 0.8"
881
+ }
882
+ },
883
+ "node_modules/safe-buffer": {
884
+ "version": "5.2.1",
885
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
886
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
887
+ "funding": [
888
+ {
889
+ "type": "github",
890
+ "url": "https://github.com/sponsors/feross"
891
+ },
892
+ {
893
+ "type": "patreon",
894
+ "url": "https://www.patreon.com/feross"
895
+ },
896
+ {
897
+ "type": "consulting",
898
+ "url": "https://feross.org/support"
899
+ }
900
+ ]
901
+ },
902
+ "node_modules/safer-buffer": {
903
+ "version": "2.1.2",
904
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
905
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
906
+ },
907
+ "node_modules/semiver": {
908
+ "version": "1.1.0",
909
+ "resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz",
910
+ "integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==",
911
+ "engines": {
912
+ "node": ">=6"
913
+ }
914
+ },
915
+ "node_modules/send": {
916
+ "version": "0.18.0",
917
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
918
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
919
+ "dependencies": {
920
+ "debug": "2.6.9",
921
+ "depd": "2.0.0",
922
+ "destroy": "1.2.0",
923
+ "encodeurl": "~1.0.2",
924
+ "escape-html": "~1.0.3",
925
+ "etag": "~1.8.1",
926
+ "fresh": "0.5.2",
927
+ "http-errors": "2.0.0",
928
+ "mime": "1.6.0",
929
+ "ms": "2.1.3",
930
+ "on-finished": "2.4.1",
931
+ "range-parser": "~1.2.1",
932
+ "statuses": "2.0.1"
933
+ },
934
+ "engines": {
935
+ "node": ">= 0.8.0"
936
+ }
937
+ },
938
+ "node_modules/send/node_modules/ms": {
939
+ "version": "2.1.3",
940
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
941
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
942
+ },
943
+ "node_modules/serve-static": {
944
+ "version": "1.15.0",
945
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
946
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
947
+ "dependencies": {
948
+ "encodeurl": "~1.0.2",
949
+ "escape-html": "~1.0.3",
950
+ "parseurl": "~1.3.3",
951
+ "send": "0.18.0"
952
+ },
953
+ "engines": {
954
+ "node": ">= 0.8.0"
955
+ }
956
+ },
957
+ "node_modules/setprototypeof": {
958
+ "version": "1.2.0",
959
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
960
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
961
+ },
962
+ "node_modules/side-channel": {
963
+ "version": "1.0.4",
964
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
965
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
966
+ "dependencies": {
967
+ "call-bind": "^1.0.0",
968
+ "get-intrinsic": "^1.0.2",
969
+ "object-inspect": "^1.9.0"
970
+ },
971
+ "funding": {
972
+ "url": "https://github.com/sponsors/ljharb"
973
+ }
974
+ },
975
+ "node_modules/statuses": {
976
+ "version": "2.0.1",
977
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
978
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
979
+ "engines": {
980
+ "node": ">= 0.8"
981
+ }
982
+ },
983
+ "node_modules/supports-color": {
984
+ "version": "7.2.0",
985
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
986
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
987
+ "dependencies": {
988
+ "has-flag": "^4.0.0"
989
+ },
990
+ "engines": {
991
+ "node": ">=8"
992
+ }
993
+ },
994
+ "node_modules/toidentifier": {
995
+ "version": "1.0.1",
996
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
997
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
998
+ "engines": {
999
+ "node": ">=0.6"
1000
+ }
1001
+ },
1002
+ "node_modules/ts-node": {
1003
+ "version": "10.9.1",
1004
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
1005
+ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
1006
+ "dependencies": {
1007
+ "@cspotcode/source-map-support": "^0.8.0",
1008
+ "@tsconfig/node10": "^1.0.7",
1009
+ "@tsconfig/node12": "^1.0.7",
1010
+ "@tsconfig/node14": "^1.0.0",
1011
+ "@tsconfig/node16": "^1.0.2",
1012
+ "acorn": "^8.4.1",
1013
+ "acorn-walk": "^8.1.1",
1014
+ "arg": "^4.1.0",
1015
+ "create-require": "^1.1.0",
1016
+ "diff": "^4.0.1",
1017
+ "make-error": "^1.1.1",
1018
+ "v8-compile-cache-lib": "^3.0.1",
1019
+ "yn": "3.1.1"
1020
+ },
1021
+ "bin": {
1022
+ "ts-node": "dist/bin.js",
1023
+ "ts-node-cwd": "dist/bin-cwd.js",
1024
+ "ts-node-esm": "dist/bin-esm.js",
1025
+ "ts-node-script": "dist/bin-script.js",
1026
+ "ts-node-transpile-only": "dist/bin-transpile.js",
1027
+ "ts-script": "dist/bin-script-deprecated.js"
1028
+ },
1029
+ "peerDependencies": {
1030
+ "@swc/core": ">=1.2.50",
1031
+ "@swc/wasm": ">=1.2.50",
1032
+ "@types/node": "*",
1033
+ "typescript": ">=2.7"
1034
+ },
1035
+ "peerDependenciesMeta": {
1036
+ "@swc/core": {
1037
+ "optional": true
1038
+ },
1039
+ "@swc/wasm": {
1040
+ "optional": true
1041
+ }
1042
+ }
1043
+ },
1044
+ "node_modules/type-is": {
1045
+ "version": "1.6.18",
1046
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1047
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1048
+ "dependencies": {
1049
+ "media-typer": "0.3.0",
1050
+ "mime-types": "~2.1.24"
1051
+ },
1052
+ "engines": {
1053
+ "node": ">= 0.6"
1054
+ }
1055
+ },
1056
+ "node_modules/typescript": {
1057
+ "version": "5.1.6",
1058
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz",
1059
+ "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==",
1060
+ "peer": true,
1061
+ "bin": {
1062
+ "tsc": "bin/tsc",
1063
+ "tsserver": "bin/tsserver"
1064
+ },
1065
+ "engines": {
1066
+ "node": ">=14.17"
1067
+ }
1068
+ },
1069
+ "node_modules/unpipe": {
1070
+ "version": "1.0.0",
1071
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1072
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1073
+ "engines": {
1074
+ "node": ">= 0.8"
1075
+ }
1076
+ },
1077
+ "node_modules/utils-merge": {
1078
+ "version": "1.0.1",
1079
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1080
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1081
+ "engines": {
1082
+ "node": ">= 0.4.0"
1083
+ }
1084
+ },
1085
+ "node_modules/v8-compile-cache-lib": {
1086
+ "version": "3.0.1",
1087
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
1088
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="
1089
+ },
1090
+ "node_modules/vary": {
1091
+ "version": "1.1.2",
1092
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1093
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1094
+ "engines": {
1095
+ "node": ">= 0.8"
1096
+ }
1097
+ },
1098
+ "node_modules/web-streams-polyfill": {
1099
+ "version": "3.2.1",
1100
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
1101
+ "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
1102
+ "engines": {
1103
+ "node": ">= 8"
1104
+ }
1105
+ },
1106
+ "node_modules/ws": {
1107
+ "version": "8.13.0",
1108
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
1109
+ "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
1110
+ "engines": {
1111
+ "node": ">=10.0.0"
1112
+ },
1113
+ "peerDependencies": {
1114
+ "bufferutil": "^4.0.1",
1115
+ "utf-8-validate": ">=5.0.2"
1116
+ },
1117
+ "peerDependenciesMeta": {
1118
+ "bufferutil": {
1119
+ "optional": true
1120
+ },
1121
+ "utf-8-validate": {
1122
+ "optional": true
1123
+ }
1124
+ }
1125
+ },
1126
+ "node_modules/yn": {
1127
+ "version": "3.1.1",
1128
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
1129
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
1130
+ "engines": {
1131
+ "node": ">=6"
1132
+ }
1133
+ }
1134
+ }
1135
+ }
package.json ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "media-server",
3
+ "version": "1.0.0",
4
+ "description": "media-server",
5
+ "main": "src/index.mts",
6
+ "scripts": {
7
+ "start": "node --loader ts-node/esm src/index.mts",
8
+ "test": "node --loader ts-node/esm src/test.mts",
9
+ "docker": "npm run docker:build && npm run docker:run",
10
+ "docker:build": "docker build -t media-server .",
11
+ "docker:run": "docker run -it -p 7860:7860 media-server"
12
+ },
13
+ "author": "Julian Bilcke <[email protected]>",
14
+ "license": "Apache License",
15
+ "dependencies": {
16
+ "@gradio/client": "^0.1.3",
17
+ "@huggingface/inference": "^2.5.2",
18
+ "@types/express": "^4.17.17",
19
+ "node-fetch": "^3.3.1",
20
+ "node-media-server": "^2.6.2",
21
+ "ts-node": "^10.9.1"
22
+ }
23
+ }
scripts/audio.sh ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ echo "starting the audio collection stream.."
4
+ while true; do
5
+ sleep 1
6
+ for f in $WEBTV_AUDIO_STORAGE_PATH*.mp3
7
+ do
8
+ ffmpeg -re -i "$f" -vn -acodec copy -f mp3 -y audio.pipe 2>/dev/null
9
+ done
10
+ done
scripts/init.sh ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ echo "creating the storage folders.."
4
+ mkdir -p $WEBTV_VIDEO_STORAGE_PATH
5
+ mkdir -p $WEBTV_AUDIO_STORAGE_PATH
6
+
7
+ echo "create the named pipes.."
8
+ mkfifo video.pipe
9
+ mkfifo audio.pipe
scripts/stream.sh ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ echo "starting the FFMPEG stream, to merge video and audio and send it to the RTMP server.."
2
+ ffmpeg -i video.pipe -i audio.pipe -c copy -f flv $WEBTV_RTMP_URL
scripts/video.sh ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ echo "starting the video collection stream.."
4
+ while true; do
5
+ sleep 1
6
+ for f in $WEBTV_VIDEO_STORAGE_PATH*.mp4
7
+ do
8
+ ffmpeg -re -i "$f" -vcodec copy -f mpegts -y video.pipe 2>/dev/null
9
+ done
10
+ done
src/downloadVideo.mts ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import path from 'node:path'
2
+ // import { promises as fs } from 'fs'
3
+ import fs from 'node:fs'
4
+
5
+ export const downloadVideo = async (remoteUrl: string, options?: { localPath: string; localFileName: string; }): Promise<string> => {
6
+
7
+ const localPath = options?.localPath || process.env.WEBTV_VIDEO_STORAGE_PATH
8
+ const localFileName = `${options?.localFileName || Date.now()}.mp4`
9
+
10
+ // download the video
11
+ const response = await fetch(remoteUrl)
12
+
13
+ // write it to the disk
14
+ const arrayBuffer = await response.arrayBuffer()
15
+
16
+ const finalPath = path.resolve(localPath, localFileName)
17
+
18
+ await fs.createWriteStream(
19
+ finalPath
20
+ ).write(Buffer.from(arrayBuffer))
21
+
22
+ return finalPath
23
+ }
src/generateSeed.mts ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ export function getRandomInt() {
2
+ return Math.floor(Math.random() * Math.pow(2, 31));
3
+ }
src/generateVideo.mts ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { client } from '@gradio/client'
2
+
3
+ import { getRandomInt } from "./generateSeed.mts"
4
+
5
+ const videoSpaceApiUrl = process.env.WEBTV_VIDEO_SPACE_API_URL
6
+ const videoSpaceDownloadUrl = process.env.WEBTV_VIDEO_SPACE_API_URL
7
+
8
+ export const generateVideo = async (prompt: string, options?: {
9
+ seed: number;
10
+ nbFrames: number;
11
+ nbSteps: number;
12
+ }) => {
13
+ const seed = options?.seed || getRandomInt()
14
+ const nbFrames = options?.nbFrames || 24
15
+ const nbSteps = options?.nbSteps || 10
16
+
17
+ const api = await client(videoSpaceApiUrl)
18
+
19
+ const rawResponse = await api.predict('/run', [
20
+ prompt, // string in 'Prompt' Textbox component
21
+ seed, // number (numeric value between 0 and 2147483647) in 'Seed' Slider component
22
+ nbFrames, // 24 // it is the nb of frames per seconds I think?
23
+ nbSteps, // 10, (numeric value between 10 and 50) in 'Number of inference steps' Slider component
24
+ ]) as any
25
+
26
+ const { name, orig_name } = rawResponse?.data?.[0]?.[0] as { name: string, orig_name: string }
27
+
28
+ return {
29
+ url: `${videoSpaceApiUrl}/file=${name}`,
30
+ name: orig_name
31
+ }
32
+ }
src/getStats.mts ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { promises as fs } from 'node:fs'
2
+
3
+ export const getStats = async () => {
4
+ const videoFilePaths = await fs.readdir(process.env.WEBTV_VIDEO_STORAGE_PATH)
5
+ const audioFilePaths = await fs.readdir(process.env.WEBTV_AUDIO_STORAGE_PATH)
6
+
7
+ return {
8
+ nbVideoFiles: videoFilePaths.length,
9
+ nbAudioFiles: audioFilePaths.length,
10
+ }
11
+ }
src/getVideoPrompt.mts ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ import { HfInference } from '@huggingface/inference'
3
+
4
+ const hf = new HfInference(process.env.WEBTV_HF_API_TOKEN)
5
+
6
+ const model = 'OpenAssistant/oasst-sft-4-pythia-12b-epoch-3.5'
7
+
8
+ export const getVideoPrompt = async (seed: string) => {
9
+ const inputs = `<|prompter|>Can you propose a caption for a new video, that we could display after the first one? Here's the caption for the first video: "${seed}"<|endoftext|><|assistant|>The best caption would be:`
10
+
11
+ const { generated_text } = await hf.textGeneration({
12
+ model,
13
+ inputs,
14
+ parameters: {
15
+ max_new_tokens: 50,
16
+ return_full_text: false,
17
+ // temperature: 0.3,
18
+ }
19
+ })
20
+
21
+ return generated_text.split(/[#\[\]]/)[0].replace('"', '')
22
+ }
23
+
24
+ */
src/index.mts ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { generateVideo } from './generateVideo.mts'
2
+ import { downloadVideo } from './downloadVideo.mts'
3
+
4
+ import { demo2 } from './prompts.mts'
5
+ import { getStats } from './getStats.mts'
6
+
7
+ const main = async () => {
8
+ console.log('Generating ideas..')
9
+ const ideas = demo2
10
+
11
+ console.log('Generating videos..')
12
+
13
+ for (const { input, captions } of ideas) {
14
+ console.log(`\nVideo to generate: ${input}`)
15
+
16
+ for (const caption of captions) {
17
+ console.log(`- generating: ${caption}`)
18
+ try {
19
+ const { url } = await generateVideo(caption)
20
+ console.log(`- downloading: ${url}`)
21
+ const downloaded = await downloadVideo(url)
22
+ console.log('- done')
23
+ } catch (err) {
24
+ console.log(`- error: ${err}`)
25
+ }
26
+ }
27
+
28
+ console.log('Finished gerating all video sequences')
29
+
30
+ console.log('Current stats:', await getStats())
31
+ }
32
+
33
+ console.log('Finished the full cycle')
34
+ setTimeout(() => {
35
+ main()
36
+ }, 3000)
37
+ }
38
+
39
+ setTimeout(() => {
40
+ main()
41
+ }, 3000)
src/prompts.mts ADDED
@@ -0,0 +1,236 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ export interface Scene {
3
+ input: string
4
+ captions: string[]
5
+ }
6
+
7
+ export const systemPrompt = `You are a helpful assistant working for a TV channel. You catalogued thousand of video snippets on various topics. You also know how stable diffusion works (an AI model to generate image using captions similar to those of image banks and image datasets), and how to prompt it "adding things like "photo of a beautiful cat drinking milk, in a trailer park, with boho style outdoor space with 60s, furnishings, mystical objects, candles, van and lights on, sunset, Canon EOS, award-winning, high quality, photorealistic, high details, hyper realistic, trending on artstation.." etc.
8
+
9
+ # Here is a more complete guide for prompting:
10
+
11
+ Write the caption in the following order: **content type > description > style > composition > camera type > additional keywords**
12
+
13
+ - Content type: What type of artwork you want to achieve? Is it a photograph, drawing, sketch, 3D render..?
14
+ - Description: define the subject, subject attributes, environment/scene. The more descriptive you are with the use of adjectives, the better the output.
15
+ - Style: we’ve seen the most common ones above, but there are also “sub-categories” – lightning, detail…
16
+ - Composition: it refers to aspect ratio, camera view and resolution.
17
+
18
+ # Useful terms
19
+ Finally, there are some words to improve your prompt, and obviously, the image you’re gonna get. These could be considered as final touches, and you can add as many and as random as you want, but here are a few examples:
20
+
21
+ ## Related to: lighting
22
+ accent lighting, ambient lighting, backlight, blacklight, blinding light, candlelight, concert lighting, crepuscular rays, direct sunlight, dusk, Edison bulb, electric arc, fire, fluorescent, glowing, glowing radioactively, glow-stick, lava glow, moonlight, natural lighting, neon lamp, nightclub lighting, nuclear waste glow, quantum dot display, spotlight, strobe, sunlight, ultraviolet, dramatic lighting, dark lighting, soft lighting, gloomy
23
+
24
+ ## Related to: detail
25
+ highly detailed, grainy, realistic, unreal engine, octane render, bokeh, vray, houdini render, quixel megascans, depth of field (or dof), arnold render, 8k uhd, raytracing, cgi, lumen reflections, cgsociety, ultra realistic, volumetric fog, overglaze, analog photo, polaroid, 100mm, film photography, dslr, cinema4d, studio quality
26
+
27
+ ## Related to: artistic techniques and materials
28
+ Digital art, digital painting, color page, featured on pixiv (for anime/manga), trending on artstation, precise line-art, tarot card, character design, concept art, symmetry, golden ratio, evocative, award winning, shiny, smooth, surreal, divine, celestial, elegant, oil painting, soft, fascinating, fine art
29
+
30
+ ## Related: to camera view and quality
31
+ ultra wide-angle, wide-angle, aerial view, massive scale, street level view, landscape, panoramic, bokeh, fisheye, dutch angle, low angle, extreme long-shot, long shot, close-up, extreme close-up, highly detailed, depth of field (or dof), 4k, 8k uhd, ultra realistic, studio quality, octane render,
32
+
33
+ ## Related to: style and composition
34
+ Surrealism, trending on artstation, matte, elegant, illustration, digital paint, epic composition, beautiful, the most beautiful image ever seen,
35
+
36
+ ## Related to: colours
37
+ Triadic colour scheme, washed colour
38
+
39
+ ## Additional keywords (used to make the video generation service use better quality data)
40
+ award winning, beautiful, stunning, breathtaking, trending on artstation, high quality, 4k, RAW photo, high detailed skin`
41
+
42
+ export const userPrompt = (input: string) =>
43
+ `# Context
44
+ I am trying to call a video generation service, and I need a sequence of captions to describe short videos snippets (about 2 to 3 seconds each).
45
+ - You are going to help me generate them, by imagining creative and entertaining sequences, with a logical sequencing (the video need to make sense on a global level, as they are part of the same story)
46
+ - It is important that the captions follow each other in a logical way, as combined they describe a longer video, action sequence and/or story.
47
+ - Please maintain consistency across the captions (ie. the camera will stay the same, the hour or light conditions). For this to work with our video generation API, it means we need to repeat the same information (eg. camera model) across each prompt.
48
+ - thus do not write "Continued from prior ... capture:", instead you need to write the keywords again
49
+ - also in the caption, no need to say things like "at the 4 second mark" etc, as this information cannot be used by the video generation tool
50
+ - IMPORTANT! please be consistent and do not mix 3D renders with real world footage!
51
+ - Try to write the caption in the following order: content type > description > style > composition > camera type > additional keywords
52
+
53
+ # Goal
54
+ Can you provide me with a list of captions?
55
+ The output must be in JSON (here is the type signature:
56
+ \`\`\`typescript
57
+ {
58
+ input: "" // the input query
59
+ captions: Array<string> // what we need to generate
60
+ }
61
+ \`\`\`
62
+
63
+ # Parameters
64
+ - I need: 10 captions
65
+ - Input: ${input}`
66
+
67
+
68
+ export const demo1 = [{
69
+ "input": "underwater footage of fishes around coral",
70
+ "captions": [
71
+ "4K video of a school of colorful clownfish dancing energetically around a vibrant coral reef, captured on a GoPro Hero Black",
72
+ "Underwater footage of a slow moving sea turtle, leisurely swimming above the coral reef, providing a close view of its shell texture, slight haptic blur due to the GoPro Hero Black",
73
+ "High detail video of glistening sunlight piercing the clear blue water, illuminating the coral reef and the intricate patterns of the fishes, captured on a GoPro Hero Black",
74
+ "A rare sight captured on a GoPro Hero Black as a ray glides majestically across the coral reef, causing a sudden scurry of fishes",
75
+ "Underwater footage illuminated by ambient lighting from the sun showing a myriad of fishes crisscrossing around the coral providing an aquatic dance, captured on a GoPro Hero Black",
76
+ "Remarkable video of a baby shark stealthily moving through the aquatic neighborhood, the coral and fishes captured on a GoPro Hero Black, providing a natural underwater scene",
77
+ "Long shot of a pod of dolphins appearing in the distance, their silhouettes a beautiful contrast against the bright blue water, captured on a GoPro Hero Black",
78
+ "Close-up video of a curious clownfish directly facing the camera, captured on a GoPro Hero Black, its vibrant orange color complementing the pastel tones of the coral",
79
+ "4K Ultra HD underwater footage of a wide variety of neon colored fishes darting in and out of their homes in the coral reef, captured on a GoPro Hero Black",
80
+ "Final unexpected encounter, a swirling school of fishes outlined against the descending sun providing a mesmerizing curtain, captured on a GoPro Hero Black"
81
+ ]
82
+ },
83
+ {
84
+ "input": "slow motion footage of various objects exploding (flour, paint, water, food etc in a very aesthetic way)",
85
+ "captions": [
86
+ "High-speed slow-motion footage of a white flour sack detonating, minimalist, dust cloud expanding, shot with a Phantom Flex high-speed camera, high quality, ultra-realistic, highly detailed, 4K resolution",
87
+ "Slow motion footage of vibrant paint cans erupting, abstract expressionist style, sprays of color filling the screen, captured with Canon EOS, Ultra wide-angle, highly detailed, 8K UHD, trending on artstation",
88
+ "Ultra high-speed real world footage of a water balloon bursting, droplets suspended in mid-air, symmetrical composition, ambient lighting, captured with RED WEAPON 8K S35, RAW photo, high detailed skin",
89
+ "Slow motion, real world footage of a food item (a ripe tomato) exploding under pressure, pieces scattering in a visually pleasing pattern, backlight, shot with Sony FS700, 4K RAW photo",
90
+ "High-speed slow-motion footage of a bottle of champagne popping, champagne droplets and steam flying out, elegant, bubbly, shot with a Phantom Flex high-speed camera, high quality, ultra-realistic, ultra wide-angle, 4K resolution",
91
+ "4K slow-motion real world footage of rainbow-hued bubbles popping, their liquid contents spilling in a kaleidoscope of color, flying in the air, ambient lighting, captured with Canon EOS, wide-angle, RAW photo, high detailed skin",
92
+ "Ultra high-speed footage of a glass milk bottle shattering, milk turning into a white splash, backlight with a dark background providing contrast, shot with RED WEAPON 8K S35, RAW photo, trending on Artstation",
93
+ "4K, Slow-motion footage of a ball of rice exploding, grains suspended in air, extreme detailed and close-up shot with a Sony FS700, RAW photo, ambient lighting",
94
+ "High-speed slow-motion footage of a packet of powder color bursting, erupting into a cloud of dust, trendy Holi festival style explosion, shot with Phantom Flex high-speed camera, high quality, ultra-realistic, wide-angle, 8K UHD resolution",
95
+ "Slow motion, real world footage of a gush of soda, shot from top of a shaken can, dramatic and dark lighting, captured with Canon EOS, depth of field, high detailed skin, RAW photo, 4K UHD resolution, ambient lighting"
96
+ ]
97
+ },
98
+ {
99
+ "input": "slow motion footage of various people doing sports (skateboard, surf, bicycle, soccer, basketball etc and more)",
100
+ "captions": [
101
+ "High-definition real-world footage of a skateboarder performing tricks in an urban setting, with graffiti in the background, during a sunny day, following a nostalgic and action-packed style, filmed through a Canon EOS with 4k resolution, a high-quality online trend on artstation.",
102
+ "Slow-motion real-world video of a surfer catching a wave, with sunset in the background, giving a vintage and adventurous style, captured with a GoPro Hero9 in 4k resolution, with attention to detail and trending on artstation.",
103
+ "Real-world footage of a person on their bicycle in a skate park, showing off their skills, while being shot during the afternoon, capturing an urban and dynamic style, taken with a Red Epic Dragon in 4k resolution, presenting a hyper-realistic appearance with high quality.",
104
+ "Slow-motion real-world recording of a soccer player scoring a goal in a field filled with sunset light, adopting a classic and energetic style, captured with an Arri Alexa camera in 4k resolution for a breathtaking quality trending on artstation.",
105
+ "Real-life video of a basketball player dunking a ball in an indoor court, shot during an evening match, adopting a stylish and thrilling style, filmed with a high-speed Phantom Flex camera in 4k for ultimate detail, with stunning results making it trendy on artstation.",
106
+ "Real-world footage of a skater in slow motion executing a kickflip, with city lights in the background, demonstrating an urban and daring style, filmed with a professional Sony FS5 in 4k resolution, that provides a highly detailed, award-winning content.",
107
+ "Slow-motion video of a surfer riding a massive wave, with the beach in the background, adhering to a tropical and energetic style, captured by a DJI Mavic Pro 2 in 4k resolution, that adds a high cinematic quality to the footage, and is a popular choice on artstation.",
108
+ "Real-life video of a cyclist racing downhill on mountain terrain, shot during sunrise, reflecting an adventurous and fast-paced style, recorded with a GoPro Hero9 in 4k resolution, exhibiting high details and trendiness on artstation.",
109
+ "Real-world soccer footage of a player performing a bicycle kick, under floodlights, offering a unique and dramatic style, captured with a Red Epic Dragon at 4k resolution, showing high-quality motion and trending on artstation.",
110
+ "Slow motion basketball footage of a player swishing a three-point shot in a packed stadium, at night, showcasing a competitive and passion-filled style, filmed with an Arri Alexa at 4k resolution, delivering ultra-high details and a trending phenomenon on artstation."
111
+ ]
112
+ },
113
+ {
114
+ "input": "video music clip of a singer who keep walking in the street various cities of the world, but the camera stays focused and centered on him, while he dance",
115
+ "captions": [
116
+ "Video of a charismatic singer walking and dancing on an authentic cobblestone street in Rome, Italy. The camera is positioned tightly on him, capturing his every movement and expression, under a soft afternoon sunlight. The style represents a naturalistic and engaging view of a music video scene shot with Canon EOS, high quality, award-winning, trending on artstation.",
117
+ "Video of the same singer still walking and dancing, this time on a vibrant and lively street in Tokyo, Japan filled with neon lights and billboards as a backdrop. The video has a pulsating, energetic style, while maintaining the same centered shot with the Canon EOS camera under artificial city light, high quality, award-winning, trending on artstation.",
118
+ "Video of the singer now seen dancing on a colorful street in Havana, Cuba with vintage cars passing by. Same centered shot, but now the scene contains enriching native Cuban detail, shot with Canon EOS, full of life, award-winning, trending on artstation.",
119
+ "Video of the singer nonchalantly walking and dancing through a bustling street market in Marrakesh, Morocco. The video showcases a chaotic yet charming atmosphere, maintaining the centered shot with the Canon EOS camera with ambient light, high quality, award-winning, trending on artstation.",
120
+ "Video of the ambulating singer dancing through the historic, brick-line streets of Dublin, Ireland. Maintaining the same centered shot, the Canon EOS captures the folk charm and rustic detail under a cloudy daylight, high quality, award-winning, trending on artstation.",
121
+ "Video of the singer continuing his dancing journey on a paradisiacal beach in Maldives. The video contrasts natural beauty with energetic performance, maintaining a centered shot with Canon EOS under a golden sunset light, high quality, award-winning, trending on artstation.",
122
+ "Video of the singer dancing in front of an iconic opera house in Sydney, Australia. Maintaining the same centered shot, the Canon EOS captures this joyful moment under a blue sky, high quality, award-winning, trending on artstation.",
123
+ "Video of the singer dancing jubilantly on a busy street of Mumbai, India. Giving a whole new dynamic to the plot, the video still maintains the same centered shot, Canon EOS capturing the colorful and frenetic pace of the Indian metropolis, under afternoon light, high quality, award-winning, trending on artstation.",
124
+ "Video of the singer now dancing on a midnight lit street in New York, USA, with skyscrapers towering overhead. The video continues with the same centered shot with the Canon EOS highlighting the sleepless streets under a moonlight, high quality, award-winning, trending on artstation.",
125
+ "Video of the singer completing his journey, dancing on an empty road, back dropped by a panoramic view of Cape Town, South Africa. Sticking with the same Canon EOS centered shot, the scene captures a magical, perfect sunset, ending as a high-quality, award-winning music video, trending on artstation."
126
+ ]
127
+ },
128
+ {
129
+ "input": "spaceships of various sizes and shapes, moving around planets, asteroids etc",
130
+ "captions": [
131
+ "3D render of a colossal spaceship ascending from the surface of an alien planet, ambient lighting showcasing the contrasting textures and intricate details of the spaceship, ultra wide-angle view, Octane Render, trending on Artstation",
132
+ "3D render of a squadron of sleek spaceships flying in formation, softly lit by the glow of a nearby gas giant, 4K video with a panoramic view, Unreal Engine, award winning",
133
+ "3D render of a close-up shot of a spaceship traversing through rocky asteroids, the ship illuminated by the ambient light of distant stars, high quality, Octane Render, highly detailed, ultra-realistic",
134
+ "3D render of an alien spaceship entering the orbit of a beautifully colored planet, surreal composition, ambient lighting casting soft shadows, aerial view, rendered with Unreal Engine, high-detail CGI",
135
+ "3D render of a lone spaceship emerging from behind a planet, backlit by a bright, distant star, cutting-edge Octane Render, wide-angle view, outstanding details, 4k quality, trending on Artstation",
136
+ "3D render of a massive spaceship fleet moving towards a nebula, twilight zone lighting, high detail, 8K UHD, aerial view, Octane Render, award-winning",
137
+ "3D render of a POV shot from a spaceship cockpit, passing by an earth-like planet and its moon, high detail, ambient lighting, Ultra realistic, Unreal Engine, 4k quality, breathtaking",
138
+ "3D render of a high-speed chase between two spaceships weaving through an asteroid belt, ambient backlighting casting dramatic shadows, fisheye view, Octane Render, high quality, 4k",
139
+ "3D render of a gigantic spaceship docking at a space station orbiting around a ringed planet, ambient light reflecting off the ships and station, landscape view, created with Octane Render, 8K UHD, trending on Artstation",
140
+ "3D render of a spaceship warfleet moving in formation towards an alien sun, cutting-edge lighting engine, cinematic composition, wide angel view, Octane Render, high detailed, 4k Ultra HD quality, award-winning"
141
+ ]
142
+ },
143
+ {
144
+ "input": "various strange extraterrestrial alien species in their natural habitat, on a variety of strange planets, with alien vegetation",
145
+ "captions": [
146
+ "Colorful and vivid imagery video of a humanoid alien species snacking on iridescent fruit in vibrant alien vegetation, with alien mountains in the background, science fiction style, ultra wide-angle view, filmed with RED Digital Cinema Camera, fascinating, trending on artstation, high quality, 4k.",
147
+ "Realistic video capture of an aquatic alien species, gliding in a glowing turquoise lake surrounded by pulsating, neon flora, underwater style, aerial view, shot with Arri Alexa LF, vibrant, award winning, 4k, highly detailed skin, studio quality.",
148
+ "10 second clip of a towering silicon-based extraterrestrial entity, dancing in symphony with the shifting solar winds, surrealistic style, landscape view, using Phantom Flex4K, celestial, award-winning, beautiful, RAW photo, high details.",
149
+ "Fascinating video footage of an insectoid alien species interacting in a social gathering amidst phosphorescent flowers, Sci-Fi fantasy style, wide-angle, on Canon C500 Mark II, trending on artstation, stunning, 4k, high detailed skin, RAW photo.",
150
+ "Truly breathtaking video of a bioluminescent jelly-like alien levitating in an atmospheric mist filled with glowing spores, surreal style, low angle, captured using DJI Zenmuse X7, winning composition, high quality, 4k.",
151
+ "Ambient light filled video capture of a tree-like extraterrestrial lifeform, conducting photosynthesis cycle, on a planet with dual suns, dramatic lighting, wide-angle, using Arri Alexa LF, stunning, trending on artstation, 4k, highly detailed skin.",
152
+ "Amazing video scene of tiny fox-like aliens hunting ethereal glowing insects under alien trees, Sci-Fi style, close-up, shot on Canon C500 Mark II, breathtaking, award-winning, beautiful, RAW photo, high details, 4k.",
153
+ "Slow motion video of iridescent bird-like aliens taking flight, on a strange neon-lit canyon planet, dreamlike style, landscape view, filmed with Phantom Flex4K, trending on artstation, high quality, fine art, 4k.",
154
+ "Close-up video of a fascinating orb-like creature with intricate patterns, floating above an alien geometrical terrain, surreal, straight-on shot, using RED Digital Cinema Camera, stunning, award winning, 4k, highly detailed skin.",
155
+ "Epic scale video capture of a herd of quadrupedal aliens, moving in harmony across vast crystalline plains, panoramic view, Sci-Fi style, filmed with DJI Zenmuse X7, trending on artstation, award-winning, stunning, 4k, RAW photo."
156
+ ]
157
+ },
158
+ {
159
+ "input": "slow motion various strange extraterrestrial alien species in their natural habitat, on a variety of strange planets, with alien vegetation",
160
+ "captions": [
161
+ "Super slow motion video of enormous long-necked alien species grazing high foliage on exotic vegetation tree-like formations, documentary style, wide-angle shot, captured on Phantom Flex4K, award-winning, trending on artstation, high quality, 4K RAW footage.",
162
+ "Slow motion video capture of a group of small, quick, lizard-like alien creatures darting through strange undergrowth, naturalistic style, handheld stabilized view, using ARRI Alexa Mini LF, stunning, high detailed skin, high definition, 4K.",
163
+ "Glacial slow motion footage of ethereal, jellyfish-like aliens, floating through a neon-rich alien skyline, ambient style, aerial view, filmed on RED Digital Cinema Camera, fascinating, beautiful, trending on artstation, 4K Ultra High Definition.",
164
+ "Detailed slow motion video of an alien insectoid hive, buzzing and pulsating in an unusual mechanical rhythm, Sci-Fi style, macro close-up, shot on Phantom Flex4K, surreal, award-winning, highly detailed skin, 4K RAW photo.",
165
+ "Slow motion video of aquatic alien species creating ethereal ripples as they weave through an otherworldly coral reef, undersea style, wide-angle underwater view, filmed with Canon C500 Mark II, fascinating, trending on artstation, 4K, RAW photo.",
166
+ "Documentary style slow motion footage of a pack of alien vegetation resembling animals, swaying in response to an invisible predator, captured on RED Digital Cinema Camera, fascinating, award winning, high quality, 4K RAW footage.",
167
+ "Spectacular slow motion video of alien avian species taking flight from otherworldly trees at sunset, nature style, low-angle view, shot with Phantom Flex4K, breathtaking, beautiful, fine art, 4K, high detailed skin.",
168
+ "Slow motion capture of pack-hunting alien species, running through a field of luminescent grass, documentary style, landscape view, filmed on ARRI Alexa Mini LF, trending on artstation, stunning, high detailed skin, 4K RAW photo.",
169
+ "Slow motion video of enormous alien fauna reaching down to drink from a liquid mercury lake, otherworldly nature style, wide-angle, captured with RED Digital Cinema Camera, awe-inspiring, award-winning, high quality, 4K ultra high definition.",
170
+ "Panoramic slow motion video capture of herd of earthy-colored extraterrestrials running across a plains-like landscape, nature documentary style, filmed with Canon C500 Mark II, stunning, award winning, high detailed skin, 4K RAW footage."
171
+ ]
172
+ },
173
+ {
174
+ "input": "skaters doing various tricks in the city, fast paced",
175
+ "captions": [
176
+ "High quality digital video of a group of skaters convening at the heart of the city, about to start their streak of daring tricks, under the tantalizing glow of evening ambient lighting, shot on DJI Phantom 4 Pro, captured in ultra HD.",
177
+ "Ultra HD video footage of a skater launching off a stair railing, demonstrating a flashy kickflip, illuminated by the city's ambient lighting, captured dynamically with a DJI Phantom 4 Pro drone hovering at a wide-angle view, cinematic, stunning quality.",
178
+ "Fast-paced digital footage of a skater speeding down a sloping concrete path in the city, performing a series of kick-turns synchronously with the fading sunlight, caught on DJI Phantom 4 Pro, high speed footage, captivating, high detail.",
179
+ "Ultra HD video of a skater jumping onto a hand rail, sliding aggressively with spectacular control, under the artificial street lights, seamlessly captured by the DJI Phantom 4 Pro drone, dynamic movement, rapid pace, award-winning",
180
+ "Digital footage of a skateboarder landing a flawless heelflip on a sloping city background, accompanied by nocturnal city lights, stunningly filmed on DJI Phantom 4 Pro, action packed, high speed, on-trend and inspiring.",
181
+ "Impressive quick shot of a skater swirling around a city-drawn graffiti corner, making sharp twists and turns on the concrete pavement, illuminated by the twilight, filmed on the DJI Phantom 4 Pro in 4k resolution, dramatic lighting, high quality.",
182
+ "Ultra HD video of a skater pulling off a stunning 360 flip under the city's neon lights, expertly transitioning from the drone's low angle to a close-up view with the DJI Phantom 4 Pro, quick transitions, high definition, energizing.",
183
+ "DJI Phantom 4 Pro-captured video of a skater doing an ollie over a park bench in the city's avenues, showing off his determination under the glow of harsh street lamps, ultra HD, high paced, dynamic action, beautiful composition.",
184
+ "Slow motion video clip of a skater mid-air, executing a perfect hardflip, illuminated by cityscape backlighting, framing the cityscape, filmed on DJI Phantom 4 Pro, professionally edited sequences, breathtaking street level view, ultra HD.",
185
+ "4K video of a skater rapidly zigzagging through city traffic, demonstrating jaw-dropping street skills, in tandem with the rhythm of the city lights, shot on the DJI Phantom 4 Pro, final high speed sequence, high detail, award winning."
186
+ ]
187
+ }
188
+ ]
189
+
190
+ export const demo2 = [
191
+ {
192
+ "input": "footage of a band playing rock and roll on a stage, we see the singer, drummer, guitar guys etc, at some point the scene should become in slow motion, we should see droplets of sweat and the guys hit their instruments hard etc",
193
+ "captions": [
194
+ "Real-life footage of a rock band performing on a stage illuminated by spotlight, shot with live concert lighting, from a wide-angle view with a Canon EOS camera, high quality, highly detailed.",
195
+ "Video of a lead singer passionately singing with the microphone, under sharp concert lighting, captured on Canon EOS camera with depth of field effects, highly detailed, RAW video.",
196
+ "Close-up capture of drummer's hands hitting the drums hard, with every stroke making a ripple on the drum surface, under sharp concert lighting, taken with Canon EOS camera, high quality, ultra-realistic.",
197
+ "Slow-motion video of guitarist strumming chords vigorously under ambient stage lighting, high details showcasing each string vibration, taken with Canon EOS, studio quality, highly detailed.",
198
+ "Film clip of bassist energetically playing riffs, under concert spotlight, expression full of determination, Canon EOS footage, high-resolution, breathtaking, award-winning.",
199
+ "Extreme close-up shot of droplets of sweat falling from musician's face filmed in slow motion, highlight of the intensity of the performance, Canon EOS capture, high definition, highly detailed, studio quality.",
200
+ "Real-life video of band members in synchrony with the rhythm, under vibrant concert lighting, shot from a low angle with a Canon EOS, ultra realistic, trending on artstation, high quality.",
201
+ "Footage of crowd swinging to the beat, stage bathed in strobe lights, captured with a wide-angle perspective on Canon EOS, RAW video, ultra detailed, studio quality.",
202
+ "Slow-motion video capturing drummer's stick rebounding off the drum surface, under dynamic concert lights, filmed with Canon EOS, high quality, ultra-realistic, breathtaking.",
203
+ "Clip of band delivering a powerful finale, bright lights flooding the stage, Canon EOS capture from ultra wide-angle, high quality, highly detailed, award-winning, beautiful."
204
+ ]
205
+ },
206
+ {
207
+ "input": "footage of a band playing doom metal on a stage, we see the members dressed as monks, surrounded by fog and atmospheric light, playing the instruments hard, at some point everything becomes slow motion",
208
+ "captions": [
209
+ "Real-life footage of a doom metal band performing on a stage, members dressed as monks, immersed in volumetric fog lit by ambient lighting, shot with gloomy-style on Canon EOS camera, high quality, highly detailed.",
210
+ "Close-up video of a lead vocalist chanting into the microphone, draped in a monk's robe, amid hazy concert lighting, captured on Canon EOS camera with depth of field effects, highly detailed, RAW video.",
211
+ "Video of drummer dressed as a monk striking the drum, creating visible sound waves in the fog, under gloomy stage lighting, taken with Canon EOS camera, high quality, ultra-realistic.",
212
+ "Slow-motion footage of guitarist dressed as a monk strumming riffs vigorously, fog swirling around him under ambient stage lighting, high details showcasing each string vibration, Canon EOS capture, studio quality, highly detailed.",
213
+ "Film clip of band members standing in the fog, playing in unison, eerie light creating shadowy figures, using a Canon EOS for the capture, high-resolution, breathtaking, award-winning.",
214
+ "Video of droplets hanging in the fog, catching ambient light, showcasing intensity of the performance captured in slow motion with Canon EOS, high definition, highly detailed, studio quality.",
215
+ "Real-life video of band members surrounded by clouds of fog, under dimly lit stage, shot from a low angle with a Canon EOS, ultra-realistic, trending on artstation, high quality.",
216
+ "Footage of an audience swaying with the doom metal rhythm, stage bathed in an ocean of fog and dim lights, captured with a wide-angle perspective on Canon EOS, RAW video, ultra detailed, studio quality.",
217
+ "Slow-motion video capturing drummer's robe flowing with every impactful drum strike, the stage bathed in eerie ambient lights, filmed with Canon EOS, high quality, ultra-realistic, breathtaking.",
218
+ "Clip of band delivering a powerful, fog-filled finale, dim lights creating spectral silhouettes, Canon EOS capture from ultra wide-angle, high quality, highly detailed, award-winning, beautiful."
219
+ ]
220
+ },
221
+ {
222
+ "input": "footage of a K-pop band performing on a stage, we see the members smiling, colorful lights, synchronized dances, crowd cheering, at some point they perform a signature move in slow motion",
223
+ "captions": [
224
+ "Real-life footage of a K-pop band energetically performing on a vibrant stage with neon lighting, members smiling and dancing in sync, shot with Canon EOS camera, high quality, highly detailed.",
225
+ "Video of the lead vocalist singing passionately, under dazzling stage lighting, captured on Canon EOS camera with depth of field effects for a dreamy feel, highly detailed, RAW video.",
226
+ "Close-up capture of members executing synchronized dance move; vibrant and playful stage lighting capturing their energy, taken with Canon EOS camera, high quality, ultra-realistic.",
227
+ "Slow-motion video of a signature dance move performed with complete synchronization; neon lights creating silhouettes and shadows, filmed with Canon EOS, studio quality, highly detailed.",
228
+ "Footage of the band members interacting with the crowd, under the playful concert lights, expression full of joy, Canon EOS footage, high-resolution, breathtaking, award-winning.",
229
+ "Extreme close-up shot of a member's smile, displaying the fun and energy of the performance, filmed with Canon EOS, high definition, highly detailed, studio quality.",
230
+ "Real-life video of band members in synchrony with each other, under vibrant stage lighting, shot from a low angle with a Canon EOS, ultra-realistic, trending on artstation, high quality.",
231
+ "Footage of enthusiastic crowd dancing to the beat, stage bathed in colorful neon lights, captured with a wide-angle perspective on Canon EOS, RAW video, ultra detailed, studio quality.",
232
+ "Slow-motion video capturing confetti falling from the top, mixing with the colorful stage lights, filmed with Canon EOS, high quality, ultra-realistic, breathtaking.",
233
+ "Clip of band making heart signs and waving to the crowd in the finale, under the playful concert lights, Canon EOS capture from ultra wide-angle, high quality, highly detailed, award-winning, beautiful."
234
+ ]
235
+ }
236
+ ]
start.sh ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # initialize the stream pipes
4
+ bash ./scripts/init.sh
5
+
6
+ # ------ background processes ---------
7
+
8
+ # starts the streaming server
9
+ node ./media-server.js &
10
+
11
+ sleep 1
12
+
13
+ # background process that creates an audio stream from audio files
14
+ nohup bash -c "scripts/audio.sh &"
15
+
16
+ # background process that creates a video stream from video files
17
+ nohup bash -c "scripts/video.sh &"
18
+
19
+ sleep 1
20
+
21
+ # background process that sends data to the media server
22
+ nohup bash -c "scripts/stream.sh &"
23
+
24
+ sleep 1
25
+
26
+ npm run start
tsconfig.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "compilerOptions": {
3
+ "allowJs": true,
4
+ "esModuleInterop": true,
5
+ "allowSyntheticDefaultImports": true,
6
+ "module": "nodenext",
7
+ "noEmit": true,
8
+ "allowImportingTsExtensions": true,
9
+ "target": "es2017"
10
+ },
11
+ "include": ["**/*.ts", "**/*.mts"],
12
+ }