marquesafonso commited on
Commit
0cb486a
·
1 Parent(s): 228a3b1

separate transcriber and process_video logic; add transcription preview form; python 3.12 (tempdir del)

Browse files
.env.example ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ HF_TOKEN="<your-hf-token>"
2
+ HF_SPACE="marquesafonso/multilang-asr-transcriber"
Dockerfile CHANGED
@@ -1,5 +1,5 @@
1
  # Use an official Python runtime as a parent image
2
- FROM python:3.11.7-slim-bullseye
3
 
4
  USER root
5
 
 
1
  # Use an official Python runtime as a parent image
2
+ FROM python:3.12-slim-bullseye
3
 
4
  USER root
5
 
Pipfile DELETED
@@ -1,19 +0,0 @@
1
- [[source]]
2
- url = "https://pypi.org/simple"
3
- verify_ssl = true
4
- name = "pypi"
5
-
6
- [packages]
7
- moviepy = "*"
8
- python-multipart = "*"
9
- fastapi = "*"
10
- uvicorn = "*"
11
- gradio-client = "*"
12
-
13
- [dev-packages]
14
- pytube = "*"
15
- tqdm = "*"
16
- requests = "*"
17
-
18
- [requires]
19
- python_version = "3.11"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Pipfile.lock DELETED
@@ -1,887 +0,0 @@
1
- {
2
- "_meta": {
3
- "hash": {
4
- "sha256": "fb53ff18a7be84d091b6dda0ebe97d80f32e3e01ee333e631cfdc33ca075ded3"
5
- },
6
- "pipfile-spec": 6,
7
- "requires": {
8
- "python_version": "3.11"
9
- },
10
- "sources": [
11
- {
12
- "name": "pypi",
13
- "url": "https://pypi.org/simple",
14
- "verify_ssl": true
15
- }
16
- ]
17
- },
18
- "default": {
19
- "annotated-types": {
20
- "hashes": [
21
- "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53",
22
- "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"
23
- ],
24
- "markers": "python_version >= '3.8'",
25
- "version": "==0.7.0"
26
- },
27
- "anyio": {
28
- "hashes": [
29
- "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94",
30
- "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"
31
- ],
32
- "markers": "python_version >= '3.8'",
33
- "version": "==4.4.0"
34
- },
35
- "certifi": {
36
- "hashes": [
37
- "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b",
38
- "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"
39
- ],
40
- "markers": "python_version >= '3.6'",
41
- "version": "==2024.7.4"
42
- },
43
- "charset-normalizer": {
44
- "hashes": [
45
- "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027",
46
- "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087",
47
- "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786",
48
- "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8",
49
- "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09",
50
- "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185",
51
- "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574",
52
- "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e",
53
- "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519",
54
- "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898",
55
- "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269",
56
- "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3",
57
- "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f",
58
- "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6",
59
- "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8",
60
- "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a",
61
- "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73",
62
- "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc",
63
- "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714",
64
- "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2",
65
- "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc",
66
- "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce",
67
- "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d",
68
- "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e",
69
- "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6",
70
- "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269",
71
- "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96",
72
- "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d",
73
- "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a",
74
- "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4",
75
- "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77",
76
- "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d",
77
- "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0",
78
- "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed",
79
- "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068",
80
- "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac",
81
- "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25",
82
- "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8",
83
- "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab",
84
- "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26",
85
- "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2",
86
- "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db",
87
- "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f",
88
- "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5",
89
- "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99",
90
- "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c",
91
- "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d",
92
- "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811",
93
- "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa",
94
- "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a",
95
- "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03",
96
- "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b",
97
- "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04",
98
- "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c",
99
- "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001",
100
- "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458",
101
- "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389",
102
- "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99",
103
- "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985",
104
- "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537",
105
- "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238",
106
- "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f",
107
- "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d",
108
- "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796",
109
- "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a",
110
- "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143",
111
- "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8",
112
- "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c",
113
- "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5",
114
- "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5",
115
- "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711",
116
- "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4",
117
- "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6",
118
- "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c",
119
- "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7",
120
- "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4",
121
- "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b",
122
- "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae",
123
- "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12",
124
- "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c",
125
- "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae",
126
- "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8",
127
- "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887",
128
- "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b",
129
- "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4",
130
- "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f",
131
- "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5",
132
- "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33",
133
- "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519",
134
- "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"
135
- ],
136
- "markers": "python_full_version >= '3.7.0'",
137
- "version": "==3.3.2"
138
- },
139
- "click": {
140
- "hashes": [
141
- "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28",
142
- "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"
143
- ],
144
- "markers": "python_version >= '3.7'",
145
- "version": "==8.1.7"
146
- },
147
- "colorama": {
148
- "hashes": [
149
- "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44",
150
- "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"
151
- ],
152
- "markers": "platform_system == 'Windows'",
153
- "version": "==0.4.6"
154
- },
155
- "decorator": {
156
- "hashes": [
157
- "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760",
158
- "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"
159
- ],
160
- "version": "==4.4.2"
161
- },
162
- "fastapi": {
163
- "hashes": [
164
- "sha256:b2537146f8c23389a7faa8b03d0bd38d4986e6983874557d95eed2acc46448ef",
165
- "sha256:bcbd45817fc2a1cd5da09af66815b84ec0d3d634eb173d1ab468ae3103e183e4"
166
- ],
167
- "index": "pypi",
168
- "version": "==0.112.1"
169
- },
170
- "filelock": {
171
- "hashes": [
172
- "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb",
173
- "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"
174
- ],
175
- "markers": "python_version >= '3.8'",
176
- "version": "==3.15.4"
177
- },
178
- "fsspec": {
179
- "hashes": [
180
- "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e",
181
- "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"
182
- ],
183
- "markers": "python_version >= '3.8'",
184
- "version": "==2024.6.1"
185
- },
186
- "gradio-client": {
187
- "hashes": [
188
- "sha256:20c40cb4d56e18de1a025ccf58079f08a304e4fb2dfbcf7c2352815b2cb31091",
189
- "sha256:d904afeae4f5682add0a6a263542c10e7669ff6c9de0a53a5c2fc9b719a24bb8"
190
- ],
191
- "index": "pypi",
192
- "version": "==1.3.0"
193
- },
194
- "h11": {
195
- "hashes": [
196
- "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d",
197
- "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"
198
- ],
199
- "markers": "python_version >= '3.7'",
200
- "version": "==0.14.0"
201
- },
202
- "httpcore": {
203
- "hashes": [
204
- "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61",
205
- "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"
206
- ],
207
- "markers": "python_version >= '3.8'",
208
- "version": "==1.0.5"
209
- },
210
- "httpx": {
211
- "hashes": [
212
- "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5",
213
- "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"
214
- ],
215
- "markers": "python_version >= '3.8'",
216
- "version": "==0.27.0"
217
- },
218
- "huggingface-hub": {
219
- "hashes": [
220
- "sha256:a990f3232aa985fe749bc9474060cbad75e8b2f115f6665a9fda5b9c97818970",
221
- "sha256:cc2579e761d070713eaa9c323e3debe39d5b464ae3a7261c39a9195b27bb8000"
222
- ],
223
- "markers": "python_full_version >= '3.8.0'",
224
- "version": "==0.24.6"
225
- },
226
- "idna": {
227
- "hashes": [
228
- "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac",
229
- "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"
230
- ],
231
- "markers": "python_version >= '3.6'",
232
- "version": "==3.8"
233
- },
234
- "imageio": {
235
- "hashes": [
236
- "sha256:4952dfeef3c3947957f6d5dedb1f4ca31c6e509a476891062396834048aeed2a",
237
- "sha256:6eb2e5244e7a16b85c10b5c2fe0f7bf961b40fcb9f1a9fd1bd1d2c2f8fb3cd65"
238
- ],
239
- "markers": "python_version >= '3.4'",
240
- "version": "==2.35.1"
241
- },
242
- "imageio-ffmpeg": {
243
- "hashes": [
244
- "sha256:0ed7a9b31f560b0c9d929c5291cd430edeb9bed3ce9a497480e536dd4326484c",
245
- "sha256:1460e84712b9d06910c1f7bb524096b0341d4b7844cea6c20e099d0a24e795b1",
246
- "sha256:1521e79e253bedbdd36a547e0cbd94a025ba0b558e17f08fea687d805a0e4698",
247
- "sha256:5289f75c7f755b499653f3209fea4efd1430cba0e39831c381aad2d458f7a316",
248
- "sha256:7fa9132a291d5eb28c44553550deb40cbdab831f2a614e55360301a6582eb205",
249
- "sha256:89efe2c79979d8174ba8476deb7f74d74c331caee3fb2b65ba2883bec0737625"
250
- ],
251
- "markers": "python_version >= '3.4'",
252
- "version": "==0.5.1"
253
- },
254
- "moviepy": {
255
- "hashes": [
256
- "sha256:2884e35d1788077db3ff89e763c5ba7bfddbd7ae9108c9bc809e7ba58fa433f5"
257
- ],
258
- "index": "pypi",
259
- "version": "==1.0.3"
260
- },
261
- "numpy": {
262
- "hashes": [
263
- "sha256:08801848a40aea24ce16c2ecde3b756f9ad756586fb2d13210939eb69b023f5b",
264
- "sha256:0937e54c09f7a9a68da6889362ddd2ff584c02d015ec92672c099b61555f8911",
265
- "sha256:0ab32eb9170bf8ffcbb14f11613f4a0b108d3ffee0832457c5d4808233ba8977",
266
- "sha256:0abb3916a35d9090088a748636b2c06dc9a6542f99cd476979fb156a18192b84",
267
- "sha256:0af3a5987f59d9c529c022c8c2a64805b339b7ef506509fba7d0556649b9714b",
268
- "sha256:10e2350aea18d04832319aac0f887d5fcec1b36abd485d14f173e3e900b83e33",
269
- "sha256:15ef8b2177eeb7e37dd5ef4016f30b7659c57c2c0b57a779f1d537ff33a72c7b",
270
- "sha256:1f817c71683fd1bb5cff1529a1d085a57f02ccd2ebc5cd2c566f9a01118e3b7d",
271
- "sha256:24003ba8ff22ea29a8c306e61d316ac74111cebf942afbf692df65509a05f111",
272
- "sha256:30014b234f07b5fec20f4146f69e13cfb1e33ee9a18a1879a0142fbb00d47673",
273
- "sha256:343e3e152bf5a087511cd325e3b7ecfd5b92d369e80e74c12cd87826e263ec06",
274
- "sha256:378cb4f24c7d93066ee4103204f73ed046eb88f9ad5bb2275bb9fa0f6a02bd36",
275
- "sha256:398049e237d1aae53d82a416dade04defed1a47f87d18d5bd615b6e7d7e41d1f",
276
- "sha256:3a3336fbfa0d38d3deacd3fe7f3d07e13597f29c13abf4d15c3b6dc2291cbbdd",
277
- "sha256:442596f01913656d579309edcd179a2a2f9977d9a14ff41d042475280fc7f34e",
278
- "sha256:44e44973262dc3ae79e9063a1284a73e09d01b894b534a769732ccd46c28cc62",
279
- "sha256:54139e0eb219f52f60656d163cbe67c31ede51d13236c950145473504fa208cb",
280
- "sha256:5474dad8c86ee9ba9bb776f4b99ef2d41b3b8f4e0d199d4f7304728ed34d0300",
281
- "sha256:54c6a63e9d81efe64bfb7bcb0ec64332a87d0b87575f6009c8ba67ea6374770b",
282
- "sha256:624884b572dff8ca8f60fab591413f077471de64e376b17d291b19f56504b2bb",
283
- "sha256:6326ab99b52fafdcdeccf602d6286191a79fe2fda0ae90573c5814cd2b0bc1b8",
284
- "sha256:652e92fc409e278abdd61e9505649e3938f6d04ce7ef1953f2ec598a50e7c195",
285
- "sha256:6c1de77ded79fef664d5098a66810d4d27ca0224e9051906e634b3f7ead134c2",
286
- "sha256:76368c788ccb4f4782cf9c842b316140142b4cbf22ff8db82724e82fe1205dce",
287
- "sha256:7a894c51fd8c4e834f00ac742abad73fc485df1062f1b875661a3c1e1fb1c2f6",
288
- "sha256:7dc90da0081f7e1da49ec4e398ede6a8e9cc4f5ebe5f9e06b443ed889ee9aaa2",
289
- "sha256:848c6b5cad9898e4b9ef251b6f934fa34630371f2e916261070a4eb9092ffd33",
290
- "sha256:899da829b362ade41e1e7eccad2cf274035e1cb36ba73034946fccd4afd8606b",
291
- "sha256:8ab81ccd753859ab89e67199b9da62c543850f819993761c1e94a75a814ed667",
292
- "sha256:8fb49a0ba4d8f41198ae2d52118b050fd34dace4b8f3fb0ee34e23eb4ae775b1",
293
- "sha256:9156ca1f79fc4acc226696e95bfcc2b486f165a6a59ebe22b2c1f82ab190384a",
294
- "sha256:9523f8b46485db6939bd069b28b642fec86c30909cea90ef550373787f79530e",
295
- "sha256:a0756a179afa766ad7cb6f036de622e8a8f16ffdd55aa31f296c870b5679d745",
296
- "sha256:a0cdef204199278f5c461a0bed6ed2e052998276e6d8ab2963d5b5c39a0500bc",
297
- "sha256:ab83adc099ec62e044b1fbb3a05499fa1e99f6d53a1dde102b2d85eff66ed324",
298
- "sha256:b34fa5e3b5d6dc7e0a4243fa0f81367027cb6f4a7215a17852979634b5544ee0",
299
- "sha256:b47c551c6724960479cefd7353656498b86e7232429e3a41ab83be4da1b109e8",
300
- "sha256:c4cd94dfefbefec3f8b544f61286584292d740e6e9d4677769bc76b8f41deb02",
301
- "sha256:c4f982715e65036c34897eb598d64aef15150c447be2cfc6643ec7a11af06574",
302
- "sha256:d8f699a709120b220dfe173f79c73cb2a2cab2c0b88dd59d7b49407d032b8ebd",
303
- "sha256:dd94ce596bda40a9618324547cfaaf6650b1a24f5390350142499aa4e34e53d1",
304
- "sha256:de844aaa4815b78f6023832590d77da0e3b6805c644c33ce94a1e449f16d6ab5",
305
- "sha256:e5f0642cdf4636198a4990de7a71b693d824c56a757862230454629cf62e323d",
306
- "sha256:f07fa2f15dabe91259828ce7d71b5ca9e2eb7c8c26baa822c825ce43552f4883",
307
- "sha256:f15976718c004466406342789f31b6673776360f3b1e3c575f25302d7e789575",
308
- "sha256:f358ea9e47eb3c2d6eba121ab512dfff38a88db719c38d1e67349af210bc7529",
309
- "sha256:f505264735ee074250a9c78247ee8618292091d9d1fcc023290e9ac67e8f1afa",
310
- "sha256:f5ebbf9fbdabed208d4ecd2e1dfd2c0741af2f876e7ae522c2537d404ca895c3",
311
- "sha256:f6b26e6c3b98adb648243670fddc8cab6ae17473f9dc58c51574af3e64d61211",
312
- "sha256:f8e93a01a35be08d31ae33021e5268f157a2d60ebd643cfc15de6ab8e4722eb1",
313
- "sha256:fe76d75b345dc045acdbc006adcb197cc680754afd6c259de60d358d60c93736",
314
- "sha256:ffbd6faeb190aaf2b5e9024bac9622d2ee549b7ec89ef3a9373fa35313d44e0e"
315
- ],
316
- "markers": "python_version != '2.7'",
317
- "version": "==2.1.0"
318
- },
319
- "packaging": {
320
- "hashes": [
321
- "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002",
322
- "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"
323
- ],
324
- "markers": "python_version >= '3.8'",
325
- "version": "==24.1"
326
- },
327
- "pillow": {
328
- "hashes": [
329
- "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885",
330
- "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea",
331
- "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df",
332
- "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5",
333
- "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c",
334
- "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d",
335
- "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd",
336
- "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06",
337
- "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908",
338
- "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a",
339
- "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be",
340
- "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0",
341
- "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b",
342
- "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80",
343
- "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a",
344
- "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e",
345
- "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9",
346
- "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696",
347
- "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b",
348
- "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309",
349
- "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e",
350
- "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab",
351
- "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d",
352
- "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060",
353
- "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d",
354
- "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d",
355
- "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4",
356
- "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3",
357
- "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6",
358
- "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb",
359
- "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94",
360
- "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b",
361
- "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496",
362
- "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0",
363
- "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319",
364
- "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b",
365
- "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856",
366
- "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef",
367
- "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680",
368
- "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b",
369
- "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42",
370
- "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e",
371
- "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597",
372
- "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a",
373
- "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8",
374
- "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3",
375
- "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736",
376
- "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da",
377
- "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126",
378
- "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd",
379
- "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5",
380
- "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b",
381
- "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026",
382
- "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b",
383
- "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc",
384
- "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46",
385
- "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2",
386
- "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c",
387
- "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe",
388
- "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984",
389
- "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a",
390
- "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70",
391
- "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca",
392
- "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b",
393
- "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91",
394
- "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3",
395
- "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84",
396
- "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1",
397
- "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5",
398
- "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be",
399
- "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f",
400
- "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc",
401
- "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9",
402
- "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e",
403
- "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141",
404
- "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef",
405
- "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22",
406
- "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27",
407
- "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e",
408
- "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"
409
- ],
410
- "markers": "python_version >= '3.8'",
411
- "version": "==10.4.0"
412
- },
413
- "proglog": {
414
- "hashes": [
415
- "sha256:19d5da037e8c813da480b741e3fa71fb1ac0a5b02bf21c41577c7f327485ec50",
416
- "sha256:658c28c9c82e4caeb2f25f488fff9ceace22f8d69b15d0c1c86d64275e4ddab4"
417
- ],
418
- "version": "==0.1.10"
419
- },
420
- "pydantic": {
421
- "hashes": [
422
- "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a",
423
- "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"
424
- ],
425
- "markers": "python_version >= '3.8'",
426
- "version": "==2.8.2"
427
- },
428
- "pydantic-core": {
429
- "hashes": [
430
- "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d",
431
- "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f",
432
- "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686",
433
- "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482",
434
- "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006",
435
- "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83",
436
- "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6",
437
- "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88",
438
- "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86",
439
- "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a",
440
- "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6",
441
- "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a",
442
- "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6",
443
- "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6",
444
- "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43",
445
- "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c",
446
- "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4",
447
- "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e",
448
- "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203",
449
- "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd",
450
- "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1",
451
- "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24",
452
- "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc",
453
- "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc",
454
- "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3",
455
- "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598",
456
- "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98",
457
- "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331",
458
- "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2",
459
- "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a",
460
- "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6",
461
- "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688",
462
- "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91",
463
- "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa",
464
- "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b",
465
- "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0",
466
- "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840",
467
- "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c",
468
- "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd",
469
- "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3",
470
- "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231",
471
- "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1",
472
- "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953",
473
- "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250",
474
- "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a",
475
- "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2",
476
- "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20",
477
- "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434",
478
- "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab",
479
- "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703",
480
- "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a",
481
- "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2",
482
- "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac",
483
- "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611",
484
- "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121",
485
- "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e",
486
- "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b",
487
- "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09",
488
- "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906",
489
- "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9",
490
- "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7",
491
- "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b",
492
- "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987",
493
- "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c",
494
- "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b",
495
- "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e",
496
- "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237",
497
- "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1",
498
- "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19",
499
- "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b",
500
- "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad",
501
- "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0",
502
- "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94",
503
- "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312",
504
- "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f",
505
- "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669",
506
- "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1",
507
- "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe",
508
- "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99",
509
- "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a",
510
- "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a",
511
- "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52",
512
- "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c",
513
- "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad",
514
- "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1",
515
- "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a",
516
- "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f",
517
- "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a",
518
- "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"
519
- ],
520
- "markers": "python_version >= '3.8'",
521
- "version": "==2.20.1"
522
- },
523
- "python-multipart": {
524
- "hashes": [
525
- "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026",
526
- "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"
527
- ],
528
- "index": "pypi",
529
- "version": "==0.0.9"
530
- },
531
- "pyyaml": {
532
- "hashes": [
533
- "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff",
534
- "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48",
535
- "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086",
536
- "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e",
537
- "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133",
538
- "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5",
539
- "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484",
540
- "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee",
541
- "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5",
542
- "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68",
543
- "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a",
544
- "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf",
545
- "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99",
546
- "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8",
547
- "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85",
548
- "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19",
549
- "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc",
550
- "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a",
551
- "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1",
552
- "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317",
553
- "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c",
554
- "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631",
555
- "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d",
556
- "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652",
557
- "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5",
558
- "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e",
559
- "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b",
560
- "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8",
561
- "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476",
562
- "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706",
563
- "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563",
564
- "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237",
565
- "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b",
566
- "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083",
567
- "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180",
568
- "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425",
569
- "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e",
570
- "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f",
571
- "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725",
572
- "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183",
573
- "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab",
574
- "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774",
575
- "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725",
576
- "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e",
577
- "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5",
578
- "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d",
579
- "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290",
580
- "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44",
581
- "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed",
582
- "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4",
583
- "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba",
584
- "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12",
585
- "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"
586
- ],
587
- "markers": "python_version >= '3.8'",
588
- "version": "==6.0.2"
589
- },
590
- "requests": {
591
- "hashes": [
592
- "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
593
- "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
594
- ],
595
- "markers": "python_version >= '3.8'",
596
- "version": "==2.32.3"
597
- },
598
- "setuptools": {
599
- "hashes": [
600
- "sha256:b208925fcb9f7af924ed2dc04708ea89791e24bde0d3020b27df0e116088b34e",
601
- "sha256:d59a3e788ab7e012ab2c4baed1b376da6366883ee20d7a5fc426816e3d7b1193"
602
- ],
603
- "markers": "python_version >= '3.8'",
604
- "version": "==73.0.1"
605
- },
606
- "sniffio": {
607
- "hashes": [
608
- "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2",
609
- "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"
610
- ],
611
- "markers": "python_version >= '3.7'",
612
- "version": "==1.3.1"
613
- },
614
- "starlette": {
615
- "hashes": [
616
- "sha256:4ec6a59df6bbafdab5f567754481657f7ed90dc9d69b0c9ff017907dd54faeff",
617
- "sha256:c7c0441065252160993a1a37cf2a73bb64d271b17303e0b0c1eb7191cfb12d75"
618
- ],
619
- "markers": "python_version >= '3.8'",
620
- "version": "==0.38.2"
621
- },
622
- "tqdm": {
623
- "hashes": [
624
- "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd",
625
- "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"
626
- ],
627
- "markers": "python_version >= '3.7'",
628
- "version": "==4.66.5"
629
- },
630
- "typing-extensions": {
631
- "hashes": [
632
- "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
633
- "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
634
- ],
635
- "markers": "python_version >= '3.8'",
636
- "version": "==4.12.2"
637
- },
638
- "urllib3": {
639
- "hashes": [
640
- "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472",
641
- "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"
642
- ],
643
- "markers": "python_version >= '3.8'",
644
- "version": "==2.2.2"
645
- },
646
- "uvicorn": {
647
- "hashes": [
648
- "sha256:4b15decdda1e72be08209e860a1e10e92439ad5b97cf44cc945fcbee66fc5788",
649
- "sha256:65fd46fe3fda5bdc1b03b94eb634923ff18cd35b2f084813ea79d1f103f711b5"
650
- ],
651
- "index": "pypi",
652
- "version": "==0.30.6"
653
- },
654
- "websockets": {
655
- "hashes": [
656
- "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b",
657
- "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6",
658
- "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df",
659
- "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b",
660
- "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205",
661
- "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892",
662
- "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53",
663
- "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2",
664
- "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed",
665
- "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c",
666
- "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd",
667
- "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b",
668
- "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931",
669
- "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30",
670
- "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370",
671
- "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be",
672
- "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec",
673
- "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf",
674
- "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62",
675
- "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b",
676
- "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402",
677
- "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f",
678
- "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123",
679
- "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9",
680
- "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603",
681
- "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45",
682
- "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558",
683
- "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4",
684
- "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438",
685
- "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137",
686
- "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480",
687
- "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447",
688
- "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8",
689
- "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04",
690
- "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c",
691
- "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb",
692
- "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967",
693
- "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b",
694
- "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d",
695
- "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def",
696
- "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c",
697
- "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92",
698
- "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2",
699
- "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113",
700
- "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b",
701
- "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28",
702
- "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7",
703
- "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d",
704
- "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f",
705
- "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468",
706
- "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8",
707
- "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae",
708
- "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611",
709
- "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d",
710
- "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9",
711
- "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca",
712
- "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f",
713
- "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2",
714
- "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077",
715
- "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2",
716
- "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6",
717
- "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374",
718
- "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc",
719
- "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e",
720
- "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53",
721
- "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399",
722
- "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547",
723
- "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3",
724
- "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870",
725
- "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5",
726
- "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8",
727
- "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"
728
- ],
729
- "markers": "python_version >= '3.8'",
730
- "version": "==12.0"
731
- }
732
- },
733
- "develop": {
734
- "certifi": {
735
- "hashes": [
736
- "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b",
737
- "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"
738
- ],
739
- "markers": "python_version >= '3.6'",
740
- "version": "==2024.7.4"
741
- },
742
- "charset-normalizer": {
743
- "hashes": [
744
- "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027",
745
- "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087",
746
- "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786",
747
- "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8",
748
- "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09",
749
- "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185",
750
- "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574",
751
- "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e",
752
- "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519",
753
- "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898",
754
- "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269",
755
- "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3",
756
- "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f",
757
- "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6",
758
- "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8",
759
- "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a",
760
- "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73",
761
- "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc",
762
- "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714",
763
- "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2",
764
- "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc",
765
- "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce",
766
- "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d",
767
- "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e",
768
- "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6",
769
- "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269",
770
- "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96",
771
- "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d",
772
- "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a",
773
- "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4",
774
- "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77",
775
- "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d",
776
- "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0",
777
- "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed",
778
- "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068",
779
- "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac",
780
- "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25",
781
- "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8",
782
- "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab",
783
- "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26",
784
- "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2",
785
- "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db",
786
- "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f",
787
- "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5",
788
- "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99",
789
- "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c",
790
- "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d",
791
- "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811",
792
- "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa",
793
- "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a",
794
- "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03",
795
- "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b",
796
- "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04",
797
- "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c",
798
- "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001",
799
- "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458",
800
- "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389",
801
- "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99",
802
- "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985",
803
- "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537",
804
- "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238",
805
- "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f",
806
- "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d",
807
- "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796",
808
- "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a",
809
- "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143",
810
- "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8",
811
- "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c",
812
- "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5",
813
- "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5",
814
- "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711",
815
- "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4",
816
- "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6",
817
- "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c",
818
- "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7",
819
- "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4",
820
- "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b",
821
- "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae",
822
- "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12",
823
- "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c",
824
- "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae",
825
- "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8",
826
- "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887",
827
- "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b",
828
- "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4",
829
- "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f",
830
- "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5",
831
- "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33",
832
- "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519",
833
- "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"
834
- ],
835
- "markers": "python_full_version >= '3.7.0'",
836
- "version": "==3.3.2"
837
- },
838
- "colorama": {
839
- "hashes": [
840
- "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44",
841
- "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"
842
- ],
843
- "markers": "platform_system == 'Windows'",
844
- "version": "==0.4.6"
845
- },
846
- "idna": {
847
- "hashes": [
848
- "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac",
849
- "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"
850
- ],
851
- "markers": "python_version >= '3.6'",
852
- "version": "==3.8"
853
- },
854
- "pytube": {
855
- "hashes": [
856
- "sha256:076052efe76f390dfa24b1194ff821d4e86c17d41cb5562f3a276a8bcbfc9d1d",
857
- "sha256:07b9904749e213485780d7eb606e5e5b8e4341aa4dccf699160876da00e12d78"
858
- ],
859
- "index": "pypi",
860
- "version": "==15.0.0"
861
- },
862
- "requests": {
863
- "hashes": [
864
- "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
865
- "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
866
- ],
867
- "markers": "python_version >= '3.8'",
868
- "version": "==2.32.3"
869
- },
870
- "tqdm": {
871
- "hashes": [
872
- "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd",
873
- "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"
874
- ],
875
- "markers": "python_version >= '3.7'",
876
- "version": "==4.66.5"
877
- },
878
- "urllib3": {
879
- "hashes": [
880
- "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472",
881
- "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"
882
- ],
883
- "markers": "python_version >= '3.8'",
884
- "version": "==2.2.2"
885
- }
886
- }
887
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
api_config_example.yml DELETED
@@ -1,6 +0,0 @@
1
- api_config:
2
- secrets:
3
- username: user
4
- password: password
5
- hf-token: <your hf-token>
6
- hf-space: marquesafonso/multilang-asr-transcriber
 
 
 
 
 
 
 
docker-compose.yml CHANGED
@@ -6,4 +6,4 @@ services:
6
  ports:
7
  - "8000:8000"
8
  volumes:
9
- - .:/app
 
6
  ports:
7
  - "8000:8000"
8
  volumes:
9
+ - .:/app
main.py CHANGED
@@ -1,27 +1,33 @@
1
  import shutil, os, logging, uvicorn, tempfile
2
  from typing import Optional
 
3
 
 
4
  from utils.process_video import process_video
5
  from utils.zip_response import zip_response
6
  from utils.read_html import read_html
7
 
8
- from fastapi import FastAPI, UploadFile, HTTPException, Form, Depends
9
  from fastapi.staticfiles import StaticFiles
10
- from fastapi.responses import HTMLResponse, Response
 
11
  from fastapi.security import HTTPBasic
12
  from pydantic import BaseModel, field_validator
13
 
 
14
  ## THIS IS A BREAKING CHANGE. SRT FILE INPUT DEPRECATED. WIP.
 
 
 
15
  ## TODO: add word level highlighting option
16
- ## TODO: separate transcriber from subtitler logic + allow for interactive validation of trancription in-browser
17
- ## TODO: add video preview component
18
- ## TODO: improve loading spinner.
19
 
20
  app = FastAPI()
21
  security = HTTPBasic()
22
- api_configs_file = os.path.abspath("api_config.yml")
23
  static_dir = os.path.join(os.path.dirname(__file__), 'static')
24
  app.mount("/static", StaticFiles(directory=static_dir), name="static")
 
 
25
 
26
  class MP4Video(BaseModel):
27
  video_file: UploadFile
@@ -46,54 +52,74 @@ async def root():
46
  """
47
  return HTMLResponse(content=html_content)
48
 
49
-
50
- @app.get("/submit_video/")
51
  async def get_form():
52
  html_content = f"""
53
- {read_html(os.path.join(os.getcwd(),"static/submit_video.html"))}
54
  """
55
  return HTMLResponse(content=html_content)
56
 
57
  async def get_temp_dir():
58
- dir = tempfile.TemporaryDirectory()
59
  try:
60
  yield dir.name
61
- finally:
62
- del dir
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
  @app.post("/process_video/")
65
- async def process_video_api(video_file: MP4Video = Depends(),
66
- task: Optional[str] = Form("transcribe"),
67
- model_version: Optional[str] = Form("deepdml/faster-whisper-large-v3-turbo-ct2"),
68
- max_words_per_line: Optional[int] = Form(6),
69
  fontsize: Optional[int] = Form(42),
70
- font: Optional[str] = Form("FuturaPTHeavy"),
71
  bg_color: Optional[str] = Form("#070a13b3"),
72
  text_color: Optional[str] = Form("white"),
73
  caption_mode: Optional[str] = Form("desktop"),
74
  temp_dir: str = Depends(get_temp_dir)
75
  ):
76
  try:
77
- logging.info("Creating temporary directories")
78
- with open(os.path.join(temp_dir, video_file.filename), 'w+b') as temp_file:
79
- logging.info("Copying video UploadFile to the temporary directory")
80
- try:
81
- shutil.copyfileobj(video_file.file, temp_file)
82
- finally:
83
- video_file.file.close()
84
- logging.info("Copying SRT UploadFile to the temp_input_path")
85
- with open(os.path.join(temp_dir, f"{video_file.filename.split('.')[0]}.srt"), 'w+') as temp_srt_file:
86
- logging.info("Processing the video...")
87
- output_path, srt_string = process_video(temp_file.name, task, model_version, max_words_per_line, fontsize, font, bg_color, text_color, caption_mode, api_configs_file)
88
- temp_srt_file.write(srt_string)
89
  logging.info("Zipping response...")
90
- with open(os.path.join(temp_dir, f"{video_file.filename.split('.')[0]}.zip"), 'w+b') as temp_zip_file:
91
- zip_file = zip_response(temp_zip_file.name, [output_path, temp_srt_file.name])
92
- return Response(
93
- content = zip_file,
94
- media_type="application/zip",
95
- headers={"Content-Disposition": f"attachment; filename={video_file.filename.split('.')[0]}.zip"}
96
- )
97
  except Exception as e:
98
  raise HTTPException(status_code=500, detail=str(e))
99
 
 
1
  import shutil, os, logging, uvicorn, tempfile
2
  from typing import Optional
3
+ from uuid import uuid4
4
 
5
+ from utils.transcriber import transcriber
6
  from utils.process_video import process_video
7
  from utils.zip_response import zip_response
8
  from utils.read_html import read_html
9
 
10
+ from fastapi import FastAPI, UploadFile, HTTPException, Request, Form, Depends
11
  from fastapi.staticfiles import StaticFiles
12
+ from fastapi.templating import Jinja2Templates
13
+ from fastapi.responses import HTMLResponse, Response, RedirectResponse
14
  from fastapi.security import HTTPBasic
15
  from pydantic import BaseModel, field_validator
16
 
17
+
18
  ## THIS IS A BREAKING CHANGE. SRT FILE INPUT DEPRECATED. WIP.
19
+ ## DONE: separate transcriber from subtitler logic. WIP.
20
+ ## DONE: improve loading spinner. WIP (with redirect)
21
+ ## TODO: add transcription preview component + allow for interactive validation of transcription in-browser. WIP
22
  ## TODO: add word level highlighting option
23
+
 
 
24
 
25
  app = FastAPI()
26
  security = HTTPBasic()
 
27
  static_dir = os.path.join(os.path.dirname(__file__), 'static')
28
  app.mount("/static", StaticFiles(directory=static_dir), name="static")
29
+ templates = Jinja2Templates(directory=static_dir)
30
+ temp_store = {}
31
 
32
  class MP4Video(BaseModel):
33
  video_file: UploadFile
 
52
  """
53
  return HTMLResponse(content=html_content)
54
 
55
+ @app.get("/transcribe_video/")
 
56
  async def get_form():
57
  html_content = f"""
58
+ {read_html(os.path.join(os.getcwd(),"static/transcribe_video.html"))}
59
  """
60
  return HTMLResponse(content=html_content)
61
 
62
  async def get_temp_dir():
63
+ dir = tempfile.TemporaryDirectory(delete=False)
64
  try:
65
  yield dir.name
66
+ except Exception as e:
67
+ HTTPException(status_code=500, detail=str(e))
68
+
69
+ @app.post("/transcribe/")
70
+ async def transcribe_api(video_file: MP4Video = Depends(),
71
+ task: str = Form("transcribe"),
72
+ model_version: str = Form("deepdml/faster-whisper-large-v3-turbo-ct2"),
73
+ max_words_per_line: int = Form(6),
74
+ temp_dir: str = Depends(get_temp_dir)):
75
+ try:
76
+ video_path = os.path.join(temp_dir, video_file.filename)
77
+ with open(video_path, 'wb') as f:
78
+ shutil.copyfileobj(video_file.file, f)
79
+
80
+ transcription = transcriber(video_path, max_words_per_line, task, model_version)
81
+
82
+ uid = str(uuid4())
83
+ temp_store[uid] = {"video_path": video_path, "transcription": transcription}
84
+ return RedirectResponse(url=f"/process_settings/?uid={uid}", status_code=303)
85
+
86
+ except Exception as e:
87
+ raise HTTPException(status_code=500, detail=str(e))
88
+
89
+ @app.get("/process_settings/")
90
+ async def process_settings(request: Request, uid: str):
91
+ data = temp_store.get(uid)
92
+ if not data:
93
+ raise HTTPException(404, "Data not found")
94
+ return templates.TemplateResponse("process_settings.html", {
95
+ "request": request,
96
+ "transcription": data["transcription"],
97
+ "video_path": data["video_path"]
98
+ })
99
 
100
  @app.post("/process_video/")
101
+ async def process_video_api(video_path: str = Form(...),
102
+ srt_string: str = Form(...),
 
 
103
  fontsize: Optional[int] = Form(42),
104
+ font: Optional[str] = Form("Helvetica"),
105
  bg_color: Optional[str] = Form("#070a13b3"),
106
  text_color: Optional[str] = Form("white"),
107
  caption_mode: Optional[str] = Form("desktop"),
108
  temp_dir: str = Depends(get_temp_dir)
109
  ):
110
  try:
111
+ output_path = process_video(video_path, srt_string, fontsize, font, bg_color, text_color, caption_mode)
112
+ with open(os.path.join(temp_dir, f"{video_path.split('.')[0]}.srt"), 'w+') as temp_srt_file:
113
+ logging.info("Processing the video...")
114
+ temp_srt_file.write(srt_string)
 
 
 
 
 
 
 
 
115
  logging.info("Zipping response...")
116
+ with open(os.path.join(temp_dir, f"{video_path.split('.')[0]}.zip"), 'w+b') as temp_zip_file:
117
+ zip_file = zip_response(temp_zip_file.name, [output_path, temp_srt_file.name])
118
+ return Response(
119
+ content = zip_file,
120
+ media_type="application/zip",
121
+ headers={"Content-Disposition": f"attachment; filename={os.path.basename(video_path).split('.')[0]}.zip"}
122
+ )
123
  except Exception as e:
124
  raise HTTPException(status_code=500, detail=str(e))
125
 
requirements.txt CHANGED
Binary files a/requirements.txt and b/requirements.txt differ
 
static/landing_page.html CHANGED
@@ -144,7 +144,7 @@
144
  <h1>Multilang-ASR-Captioner</h1>
145
  <p>A multilingual automatic speech recognition and video captioning tool using faster whisper.<br>
146
  Supports real-time translation to english. Runs on consumer grade cpu.</p>
147
- <a href="/submit_video" class="button submit">Submit Video</a>
148
  <a href="/docs" class="button docs">Documentation</a>
149
  </div>
150
  <!-- Footer -->
 
144
  <h1>Multilang-ASR-Captioner</h1>
145
  <p>A multilingual automatic speech recognition and video captioning tool using faster whisper.<br>
146
  Supports real-time translation to english. Runs on consumer grade cpu.</p>
147
+ <a href="/transcribe_video" class="button submit">Transcribe Video</a>
148
  <a href="/docs" class="button docs">Documentation</a>
149
  </div>
150
  <!-- Footer -->
static/process_settings.html ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Process Video</title>
5
+ <style>
6
+ body { font-family: Arial; background: #f0f0f0; padding: 2rem; }
7
+ form { background: white; padding: 2rem; border-radius: 10px; max-width: 700px; margin: auto; }
8
+ label, select, input, textarea { display: block; width: 100%; margin-bottom: 1rem; }
9
+ textarea { height: 200px; font-family: monospace; }
10
+ input[type="submit"] { background: #4CAF50; color: white; padding: 0.8rem; border: none; cursor: pointer; }
11
+ </style>
12
+ </head>
13
+ <body>
14
+ <form action="/process_video/" method="post">
15
+ <h2>Step 2: Edit Transcription & Style</h2>
16
+
17
+ <label for="srt_string">Correct Transcription</label>
18
+ <textarea name="srt_string" id="srt_string">{{ transcription }}</textarea>
19
+
20
+ <label for="fontsize">Font size</label>
21
+ <input type="number" name="fontsize" value="42">
22
+
23
+ <label for="font">Font</label>
24
+ <select id="font" name="font">
25
+ <option>Loading fonts...</option>
26
+ </select><br>
27
+
28
+ <label for="bg_color">Background color</label>
29
+ <input type="text" name="bg_color" value="#070a13b3">
30
+
31
+ <label for="text_color">Text color</label>
32
+ <select id="text_color" name="text_color">
33
+ <option>Loading colors...</option>
34
+ </select>
35
+
36
+ <label for="caption_mode">Caption mode</label>
37
+ <select name="caption_mode">
38
+ <option value="desktop">Desktop</option>
39
+ <option value="mobile">Mobile</option>
40
+ </select>
41
+
42
+ <input type="hidden" name="video_path" value="{{ video_path }}">
43
+ <input type="submit" value="Render & Download">
44
+ </form>
45
+ <script>
46
+ // Load dropdown options with optional default
47
+ function populateDropdown(id, url, defaultValue = null) {
48
+ fetch(url)
49
+ .then(response => response.text())
50
+ .then(data => {
51
+ const select = document.getElementById(id);
52
+ select.innerHTML = '';
53
+ const lines = data.split('\n').map(x => x.trim()).filter(Boolean);
54
+
55
+ lines.forEach(item => {
56
+ const opt = document.createElement('option');
57
+ opt.value = item;
58
+ opt.textContent = item;
59
+ if (item === defaultValue) {
60
+ opt.selected = true;
61
+ }
62
+ select.appendChild(opt);
63
+ });
64
+ })
65
+ .catch(error => {
66
+ console.error(`Error loading ${url}:`, error);
67
+ });
68
+ }
69
+
70
+ // Set your default font and color here:
71
+ const DEFAULT_FONT = "Helvetica";
72
+ const DEFAULT_COLOR = "white";
73
+
74
+ // Populate dropdowns with defaults
75
+ populateDropdown('font', '/static/fonts.txt', DEFAULT_FONT);
76
+ populateDropdown('text_color', '/static/colors.txt', DEFAULT_COLOR);
77
+ </script>
78
+ </body>
79
+ </html>
static/submit_video.html DELETED
@@ -1,254 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" integrity="sha512-Fo3rlrZj/k7ujTnHg4CGR2D7kSs0v4LLanw2qksYuRlEzO+tcaEPQogQ0KaoGN26/zrn20ImR1DfuLWnOo7aBA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
5
- <style>
6
- /* CSS Styles */
7
- body {
8
- font-family: 'Arial', sans-serif;
9
- background-color: #f0f0f0;
10
- color: #333;
11
- line-height: 1.6;
12
- margin: 0;
13
- padding: 0;
14
- display: flex;
15
- flex-direction: column;
16
- min-height: 100vh;
17
- }
18
-
19
- form {
20
- max-width: 900px;
21
- margin: .9rem auto;
22
- padding: 1rem;
23
- background: #ffffff;
24
- border-radius: 8px;
25
- box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);
26
- display: flex;
27
- flex-direction: column;
28
- }
29
-
30
- .form-wrapper {
31
- display: flex;
32
- flex-wrap: wrap;
33
- gap: 20px;
34
- }
35
-
36
- .form-group {
37
- flex: 1;
38
- min-width: calc(50% - 20px);
39
- box-sizing: border-box;
40
- }
41
-
42
- .form-group h3 {
43
- margin-bottom: 15px;
44
- color: #4CAF50;
45
- font-size: 18px;
46
- border-bottom: 2px solid #4CAF50;
47
- padding-bottom: 5px;
48
- }
49
-
50
- input[type=file],
51
- input[type=number],
52
- input[type=text],
53
- select {
54
- width: 100%;
55
- padding: 10px;
56
- margin-bottom: 10px;
57
- border-radius: 4px;
58
- border: 1px solid #ddd;
59
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
60
- font-size: 13px;
61
- box-sizing: border-box; /* Ensure padding and border are included in the element's total width and height */
62
- }
63
-
64
- input[type=submit] {
65
- width: 100%;
66
- background-color: #4CAF50;
67
- color: white;
68
- padding: 12px 18px;
69
- border: none;
70
- border-radius: 5px;
71
- cursor: pointer;
72
- font-size: 15px;
73
- margin-top: 20px;
74
- transition: background-color 0.3s ease;
75
- box-sizing: border-box;
76
- }
77
-
78
- input[type=submit]:hover {
79
- background-color: #45a049;
80
- }
81
-
82
- label {
83
- margin-top: 10px;
84
- display: block;
85
- font-weight: bold;
86
- font-size: 13px;
87
- }
88
-
89
- .footer {
90
- width: 100%;
91
- background-color: #f0f0f0;
92
- text-align: center;
93
- }
94
-
95
- .footer a {
96
- padding: 0.5rem;
97
- text-decoration: none;
98
- }
99
-
100
- .fa-github:hover {
101
- transform: scale(1.2);
102
- }
103
-
104
- .fa-github {
105
- color: #000000;
106
- }
107
-
108
- .fa-linkedin:hover {
109
- transform: scale(1.2);
110
- }
111
-
112
- .fa-linkedin {
113
- color: #0077B5;
114
- }
115
-
116
- /* Additional Responsiveness */
117
- @media (max-width: 992px) {
118
- form {
119
- max-width: 90%;
120
- margin-left: 15%;
121
- margin-right: 15%;
122
- padding: 15px;
123
- }
124
-
125
- .form-wrapper {
126
- flex-direction: column;
127
- }
128
-
129
- .form-group {
130
- min-width: 100%;
131
- }
132
- }
133
-
134
- @media (max-width: 768px) {
135
- form {
136
- max-width: 90%;
137
- margin-left: 10%;
138
- margin-right: 10%;
139
- padding: 15px;
140
- }
141
- }
142
-
143
- @media (max-width: 480px) {
144
- form {
145
- max-width: 90%;
146
- margin-left: 5%;
147
- margin-right: 5%;
148
- padding: 10px;
149
- }
150
- }
151
- </style>
152
- </head>
153
- <body>
154
- <form id="video-form" action="/process_video/" method="post" enctype="multipart/form-data">
155
- <div class="form-wrapper">
156
- <div class="form-group">
157
- <h3>Inputs & Task Selection</h3>
158
- <label for="video_file">Video File</label>
159
- <input type="file" id="video_file" name="video_file"><br>
160
-
161
- <label for="task">Task</label>
162
- <select id="task" name="task">
163
- <option value="transcribe">Transcribe</option>
164
- <option value="translate">Translate</option>
165
- </select>
166
-
167
- <label for="model_version">Model Version</label>
168
- <select id="model_version" name="model_version">
169
- <option value="deepdml/faster-whisper-large-v3-turbo-ct2">faster-whisper-large-v3-turbo</option>
170
- <option value="turbo">turbo</option>
171
- <option value="large-v3">large-v3</option>
172
- </select>
173
- </div>
174
-
175
- <div class="form-group">
176
- <h3>Visual Parameters</h3>
177
- <label for="max_words_per_line">Max words per line</label>
178
- <input type="number" id="max_words_per_line" name="max_words_per_line" value="6"><br>
179
-
180
- <label for="fontsize">Font size</label>
181
- <input type="number" id="fontsize" name="fontsize" value="42"><br>
182
-
183
- <label for="font">Font</label>
184
- <select id="font" name="font">
185
- <option>Loading fonts...</option>
186
- </select><br>
187
-
188
- <label for="bg_color">Background color</label>
189
- <input type="text" id="bg_color" name="bg_color" value="#00FFFF00"><br>
190
-
191
- <label for="text_color">Text color</label>
192
- <select id="text_color" name="text_color">
193
- <option>Loading colors...</option>
194
- </select><br>
195
-
196
- <label for="caption_mode">Caption mode</label>
197
- <select id="caption_mode" name="caption_mode">
198
- <option value="desktop">Desktop</option>
199
- <option value="mobile">Mobile</option>
200
- </select>
201
- </div>
202
- </div>
203
-
204
- <div id="loading" style="display:none; text-align: center; margin-top: 10px; font-weight: bold;">
205
- <i class="fas fa-spinner fa-spin"></i> Processing, please wait...
206
- </div>
207
-
208
- <input type="submit" value="Submit">
209
- </form>
210
- <div class="footer">
211
- <p>Created by:</p>
212
- <a href="https://github.com/marquesafonso" class="github"><i class="fab fa-github fa-3x"></i></a>
213
- <a href="https://www.linkedin.com/in/marquesafonso" class="linkedin"><i class="fab fa-linkedin fa-3x"></i></a>
214
- </div>
215
- <script>
216
- // Loading dropdown options
217
- function populateDropdown(id, url, defaultValue = null) {
218
- fetch(url)
219
- .then(response => response.text())
220
- .then(data => {
221
- const select = document.getElementById(id);
222
- select.innerHTML = '';
223
- const lines = data.split('\n').map(x => x.trim()).filter(Boolean);
224
-
225
- lines.forEach(item => {
226
- const opt = document.createElement('option');
227
- opt.value = item;
228
- opt.textContent = item;
229
- if (item === defaultValue) {
230
- opt.selected = true;
231
- }
232
- select.appendChild(opt);
233
- });
234
- })
235
- .catch(error => {
236
- console.error(`Error loading ${url}:`, error);
237
- });
238
- }
239
- // default font and color:
240
- const DEFAULT_FONT = "Helvetica";
241
- const DEFAULT_COLOR = "white";
242
- // Init dropdowns
243
- populateDropdown('font', '/static/fonts.txt', DEFAULT_FONT);
244
- populateDropdown('text_color', '/static/colors.txt', DEFAULT_COLOR);
245
-
246
- // Show loading spinner on submit
247
- document.getElementById('video-form').addEventListener('submit', function () {
248
- document.getElementById('loading').style.display = 'block';
249
- });
250
- </script>
251
- </body>
252
- </html>
253
-
254
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
static/transcribe_video.html ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" integrity="sha512-Fo3rlrZj/k7ujTnHg4CGR2D7kSs0v4LLanw2qksYuRlEzO+tcaEPQogQ0KaoGN26/zrn20ImR1DfuLWnOo7aBA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
5
+ <title>Transcribe Video</title>
6
+ <style>
7
+ body { font-family: Arial; background: #f0f0f0; padding: 2rem; }
8
+ form { background: white; padding: 2rem; border-radius: 10px; max-width: 600px; margin: auto; }
9
+ label, select, input { display: block; width: 100%; margin-bottom: 1rem; }
10
+ input[type="submit"] { background: #4CAF50; color: white; padding: 0.8rem; border: none; cursor: pointer; }
11
+ </style>
12
+ </head>
13
+ <body>
14
+ <form id="video-form" action="/transcribe/" method="post" enctype="multipart/form-data">
15
+ <h2>Step 1: Upload & Transcribe</h2>
16
+
17
+ <label for="video_file">Video File</label>
18
+ <input type="file" name="video_file" id="video_file" required>
19
+
20
+ <label for="task">Task</label>
21
+ <select name="task" id="task">
22
+ <option value="transcribe">Transcribe</option>
23
+ <option value="translate">Translate</option>
24
+ </select>
25
+
26
+ <label for="model_version">Model Version</label>
27
+ <select name="model_version" id="model_version">
28
+ <option value="deepdml/faster-whisper-large-v3-turbo-ct2">faster-whisper-large-v3-turbo</option>
29
+ <option value="turbo">turbo</option>
30
+ <option value="large-v3">large-v3</option>
31
+ </select>
32
+
33
+ <label for="max_words_per_line">Max words per line</label>
34
+ <input type="number" name="max_words_per_line" id="max_words_per_line" value="6">
35
+
36
+ <div id="loading" style="display:none; text-align: center; margin-top: 10px; margin-bottom: 10px; font-weight: bold;">
37
+ <i class="fas fa-spinner fa-spin"></i> Processing, please wait...
38
+ </div>
39
+
40
+ <input type="submit" value="Transcribe">
41
+ </form>
42
+ <script>
43
+ // Show loading spinner on submit
44
+ document.getElementById('video-form').addEventListener('submit', function () {
45
+ document.getElementById('loading').style.display = 'block';
46
+ });
47
+ </script>
48
+ </body>
49
+ </html>
utils/api_configs.py DELETED
@@ -1,6 +0,0 @@
1
- import yaml
2
-
3
- def api_configs(config_file):
4
- with open(config_file, 'r') as f:
5
- db_config = yaml.safe_load(f)
6
- return db_config["api_config"]
 
 
 
 
 
 
 
utils/process_video.py CHANGED
@@ -1,22 +1,17 @@
1
  import logging, os
2
- from utils.transcriber import transcriber
3
  from utils.subtitler import subtitler
4
 
5
  def process_video(invideo_file: str,
6
- task: str,
7
- model_version: str,
8
- max_words_per_line:int,
9
  fontsize:str,
10
  font:str,
11
  bg_color:str,
12
  text_color:str,
13
- caption_mode:str,
14
- config_file:str
15
  ):
16
  invideo_path_parts = os.path.normpath(invideo_file).split(os.path.sep)
17
  VIDEO_NAME = os.path.basename(invideo_file)
18
  OUTVIDEO_PATH = os.path.join(os.path.normpath('/'.join(invideo_path_parts[:-1])), f"result_{VIDEO_NAME}")
19
- srt_string = transcriber(invideo_file, max_words_per_line, task, model_version, config_file)
20
  logging.info("Subtitling...")
21
  subtitler(invideo_file, srt_string, OUTVIDEO_PATH, fontsize, font, bg_color, text_color, caption_mode)
22
- return OUTVIDEO_PATH, srt_string
 
1
  import logging, os
 
2
  from utils.subtitler import subtitler
3
 
4
  def process_video(invideo_file: str,
5
+ srt_string:str,
 
 
6
  fontsize:str,
7
  font:str,
8
  bg_color:str,
9
  text_color:str,
10
+ caption_mode:str
 
11
  ):
12
  invideo_path_parts = os.path.normpath(invideo_file).split(os.path.sep)
13
  VIDEO_NAME = os.path.basename(invideo_file)
14
  OUTVIDEO_PATH = os.path.join(os.path.normpath('/'.join(invideo_path_parts[:-1])), f"result_{VIDEO_NAME}")
 
15
  logging.info("Subtitling...")
16
  subtitler(invideo_file, srt_string, OUTVIDEO_PATH, fontsize, font, bg_color, text_color, caption_mode)
17
+ return OUTVIDEO_PATH
utils/transcriber.py CHANGED
@@ -1,14 +1,15 @@
 
1
  from gradio_client import Client, handle_file
2
- from utils.api_configs import api_configs
3
 
4
  def transcriber(invideo_file:str,
5
  max_words_per_line:int,
6
  task:str,
7
- model_version:str,
8
- config_file:str
9
  ):
10
- HF_TOKEN = api_configs(config_file)["secrets"]["hf-token"]
11
- HF_SPACE = api_configs(config_file)["secrets"]["hf-space"]
 
12
  client = Client(HF_SPACE, hf_token=HF_TOKEN)
13
  result = client.predict(
14
  file_input=handle_file(invideo_file),
 
1
+ import os
2
  from gradio_client import Client, handle_file
3
+ from dotenv import load_dotenv
4
 
5
  def transcriber(invideo_file:str,
6
  max_words_per_line:int,
7
  task:str,
8
+ model_version:str
 
9
  ):
10
+ load_dotenv()
11
+ HF_TOKEN = os.getenv("HF_TOKEN")
12
+ HF_SPACE = os.getenv("HF_SPACE")
13
  client = Client(HF_SPACE, hf_token=HF_TOKEN)
14
  result = client.predict(
15
  file_input=handle_file(invideo_file),