This commit is contained in:
Omer Sabic 2024-06-10 21:11:17 +02:00
parent c53d4f6e84
commit 3da2300226
8 changed files with 176 additions and 1330 deletions

View File

@ -1,784 +0,0 @@
WEBVTT
Kind: captions
Language: en
00:00:11.370 --> 00:00:14.669 align:start position:0%
[Music]
00:00:14.669 --> 00:00:14.679 align:start position:0%
00:00:14.679 --> 00:00:16.590 align:start position:0%
I<00:00:14.759><c> am</c><00:00:14.960><c> very</c><00:00:15.200><c> happy</c><00:00:15.440><c> to</c><00:00:15.679><c> say</c><00:00:16.119><c> that</c><00:00:16.279><c> thanks</c><00:00:16.440><c> to</c>
00:00:16.590 --> 00:00:16.600 align:start position:0%
I am very happy to say that thanks to
00:00:16.600 --> 00:00:19.070 align:start position:0%
I am very happy to say that thanks to
the<00:00:16.720><c> hard</c><00:00:16.920><c> work</c><00:00:17.160><c> of</c><00:00:17.400><c> IMS</c><00:00:18.039><c> null</c><00:00:18.520><c> and</c><00:00:18.720><c> several</c>
00:00:19.070 --> 00:00:19.080 align:start position:0%
the hard work of IMS null and several
00:00:19.080 --> 00:00:21.230 align:start position:0%
the hard work of IMS null and several
other<00:00:19.400><c> Iris</c><00:00:19.680><c> Shader</c><00:00:20.080><c> devs</c><00:00:20.760><c> our</c><00:00:20.960><c> most</c>
00:00:21.230 --> 00:00:21.240 align:start position:0%
other Iris Shader devs our most
00:00:21.240 --> 00:00:22.870 align:start position:0%
other Iris Shader devs our most
requested<00:00:21.680><c> feature</c><00:00:22.039><c> is</c><00:00:22.199><c> now</c><00:00:22.400><c> finally</c>
00:00:22.870 --> 00:00:22.880 align:start position:0%
requested feature is now finally
00:00:22.880 --> 00:00:26.349 align:start position:0%
requested feature is now finally
available<00:00:23.880><c> as</c><00:00:24.039><c> of</c><00:00:24.240><c> Iris</c><00:00:24.599><c> 1.7</c><00:00:25.560><c> Iris</c><00:00:25.960><c> now</c><00:00:26.160><c> has</c>
00:00:26.349 --> 00:00:26.359 align:start position:0%
available as of Iris 1.7 Iris now has
00:00:26.359 --> 00:00:29.230 align:start position:0%
available as of Iris 1.7 Iris now has
full<00:00:26.640><c> DH</c><00:00:27.240><c> support</c><00:00:28.240><c> this</c><00:00:28.359><c> means</c><00:00:28.640><c> that</c><00:00:28.800><c> shaders</c>
00:00:29.230 --> 00:00:29.240 align:start position:0%
full DH support this means that shaders
00:00:29.240 --> 00:00:31.550 align:start position:0%
full DH support this means that shaders
designed<00:00:29.560><c> with</c><00:00:29.720><c> DH</c><00:00:30.160><c> in</c><00:00:30.279><c> mind</c><00:00:30.599><c> will</c><00:00:30.759><c> render</c><00:00:31.080><c> LOD</c>
00:00:31.550 --> 00:00:31.560 align:start position:0%
designed with DH in mind will render LOD
00:00:31.560 --> 00:00:33.510 align:start position:0%
designed with DH in mind will render LOD
seamlessly<00:00:32.079><c> with</c><00:00:32.239><c> vanilla</c>
00:00:33.510 --> 00:00:33.520 align:start position:0%
seamlessly with vanilla
00:00:33.520 --> 00:00:36.069 align:start position:0%
seamlessly with vanilla
chunks<00:00:34.520><c> in</c><00:00:34.640><c> order</c><00:00:34.840><c> for</c><00:00:35.040><c> Iris</c><00:00:35.360><c> to</c><00:00:35.520><c> add</c><00:00:35.680><c> DH</c>
00:00:36.069 --> 00:00:36.079 align:start position:0%
chunks in order for Iris to add DH
00:00:36.079 --> 00:00:38.510 align:start position:0%
chunks in order for Iris to add DH
support<00:00:36.600><c> the</c><00:00:36.760><c> DH</c><00:00:37.239><c> API</c><00:00:37.680><c> has</c><00:00:37.800><c> been</c><00:00:38.000><c> updated</c><00:00:38.360><c> with</c>
00:00:38.510 --> 00:00:38.520 align:start position:0%
support the DH API has been updated with
00:00:38.520 --> 00:00:41.150 align:start position:0%
support the DH API has been updated with
several<00:00:38.800><c> new</c><00:00:38.920><c> methods</c><00:00:39.239><c> and</c><00:00:39.719><c> objects</c><00:00:40.719><c> however</c>
00:00:41.150 --> 00:00:41.160 align:start position:0%
several new methods and objects however
00:00:41.160 --> 00:00:43.830 align:start position:0%
several new methods and objects however
there<00:00:41.280><c> were</c><00:00:41.559><c> also</c><00:00:41.960><c> several</c><00:00:42.320><c> breaking</c><00:00:42.840><c> changes</c>
00:00:43.830 --> 00:00:43.840 align:start position:0%
there were also several breaking changes
00:00:43.840 --> 00:00:45.590 align:start position:0%
there were also several breaking changes
most<00:00:44.079><c> of</c><00:00:44.280><c> which</c><00:00:44.399><c> were</c><00:00:44.559><c> due</c><00:00:44.760><c> to</c><00:00:44.879><c> mistakes</c><00:00:45.200><c> on</c><00:00:45.399><c> my</c>
00:00:45.590 --> 00:00:45.600 align:start position:0%
most of which were due to mistakes on my
00:00:45.600 --> 00:00:48.630 align:start position:0%
most of which were due to mistakes on my
end<00:00:46.079><c> due</c><00:00:46.239><c> to</c><00:00:46.399><c> misnaming</c><00:00:46.879><c> a</c><00:00:47.000><c> bunch</c><00:00:47.160><c> of</c><00:00:47.640><c> objects</c>
00:00:48.630 --> 00:00:48.640 align:start position:0%
end due to misnaming a bunch of objects
00:00:48.640 --> 00:00:51.310 align:start position:0%
end due to misnaming a bunch of objects
sorry<00:00:48.960><c> about</c><00:00:49.280><c> that</c><00:00:50.280><c> the</c><00:00:50.399><c> full</c><00:00:50.640><c> list</c><00:00:50.800><c> of</c><00:00:50.960><c> API</c>
00:00:51.310 --> 00:00:51.320 align:start position:0%
sorry about that the full list of API
00:00:51.320 --> 00:00:53.430 align:start position:0%
sorry about that the full list of API
changes<00:00:51.640><c> are</c><00:00:51.800><c> linked</c><00:00:52.039><c> in</c><00:00:52.160><c> the</c><00:00:52.280><c> description</c>
00:00:53.430 --> 00:00:53.440 align:start position:0%
changes are linked in the description
00:00:53.440 --> 00:00:55.990 align:start position:0%
changes are linked in the description
below<00:00:54.440><c> along</c><00:00:54.680><c> with</c><00:00:54.879><c> those</c><00:00:55.039><c> two</c><00:00:55.239><c> major</c><00:00:55.520><c> changes</c>
00:00:55.990 --> 00:00:56.000 align:start position:0%
below along with those two major changes
00:00:56.000 --> 00:00:59.389 align:start position:0%
below along with those two major changes
DH<00:00:56.520><c> now</c><00:00:56.680><c> supports</c><00:00:57.079><c> Minecraft</c><00:00:57.520><c> versions</c><00:00:58.399><c> 1.2.2</c>
00:00:59.389 --> 00:00:59.399 align:start position:0%
DH now supports Minecraft versions 1.2.2
00:00:59.399 --> 00:01:03.590 align:start position:0%
DH now supports Minecraft versions 1.2.2
1<00:01:00.000><c> 20.4</c><00:01:00.760><c> and</c><00:01:00.960><c> 1</c><00:01:01.640><c> 1206</c><00:01:02.640><c> bringing</c><00:01:02.960><c> the</c><00:01:03.199><c> supported</c>
00:01:03.590 --> 00:01:03.600 align:start position:0%
1 20.4 and 1 1206 bringing the supported
00:01:03.600 --> 00:01:05.789 align:start position:0%
1 20.4 and 1 1206 bringing the supported
version<00:01:03.960><c> count</c><00:01:04.239><c> up</c><00:01:04.360><c> to</c>
00:01:05.789 --> 00:01:05.799 align:start position:0%
version count up to
00:01:05.799 --> 00:01:08.670 align:start position:0%
version count up to
9<00:01:06.799><c> moving</c><00:01:07.119><c> along</c><00:01:07.759><c> there</c><00:01:07.960><c> were</c><00:01:08.240><c> several</c>
00:01:08.670 --> 00:01:08.680 align:start position:0%
9 moving along there were several
00:01:08.680 --> 00:01:10.670 align:start position:0%
9 moving along there were several
graphical<00:01:09.119><c> improvements</c><00:01:09.640><c> for</c><00:01:09.840><c> your</c><00:01:10.119><c> viewing</c>
00:01:10.670 --> 00:01:10.680 align:start position:0%
graphical improvements for your viewing
00:01:10.680 --> 00:01:13.109 align:start position:0%
graphical improvements for your viewing
pleasure<00:01:11.680><c> first</c><00:01:11.920><c> and</c><00:01:12.080><c> foremost</c><00:01:12.759><c> Hollow</c>
00:01:13.109 --> 00:01:13.119 align:start position:0%
pleasure first and foremost Hollow
00:01:13.119 --> 00:01:14.630 align:start position:0%
pleasure first and foremost Hollow
structures<00:01:13.560><c> will</c><00:01:13.759><c> no</c><00:01:13.920><c> longer</c><00:01:14.200><c> turn</c><00:01:14.400><c> into</c>
00:01:14.630 --> 00:01:14.640 align:start position:0%
structures will no longer turn into
00:01:14.640 --> 00:01:17.950 align:start position:0%
structures will no longer turn into
swiss<00:01:15.000><c> cheese</c><00:01:15.400><c> at</c><00:01:15.560><c> lower</c><00:01:15.840><c> detail</c>
00:01:17.950 --> 00:01:17.960 align:start position:0%
swiss cheese at lower detail
00:01:17.960 --> 00:01:20.190 align:start position:0%
swiss cheese at lower detail
levels<00:01:18.960><c> in</c><00:01:19.040><c> order</c><00:01:19.280><c> to</c><00:01:19.439><c> help</c><00:01:19.680><c> smooth</c><00:01:20.040><c> the</c>
00:01:20.190 --> 00:01:20.200 align:start position:0%
levels in order to help smooth the
00:01:20.200 --> 00:01:22.149 align:start position:0%
levels in order to help smooth the
transition<00:01:20.799><c> between</c><00:01:21.159><c> vanilla</c><00:01:21.600><c> and</c><00:01:21.720><c> LOD</c>
00:01:22.149 --> 00:01:22.159 align:start position:0%
transition between vanilla and LOD
00:01:22.159 --> 00:01:26.030 align:start position:0%
transition between vanilla and LOD
chunks<00:01:22.880><c> grass</c><00:01:23.159><c> will</c><00:01:23.360><c> now</c><00:01:23.520><c> fade</c><00:01:23.799><c> from</c><00:01:24.079><c> green</c><00:01:24.360><c> to</c>
00:01:26.030 --> 00:01:26.040 align:start position:0%
chunks grass will now fade from green to
00:01:26.040 --> 00:01:28.510 align:start position:0%
chunks grass will now fade from green to
Brown<00:01:27.040><c> well</c><00:01:27.200><c> I</c><00:01:27.320><c> don't</c><00:01:27.560><c> recommend</c><00:01:28.040><c> using</c><00:01:28.360><c> this</c>
00:01:28.510 --> 00:01:28.520 align:start position:0%
Brown well I don't recommend using this
00:01:28.520 --> 00:01:29.950 align:start position:0%
Brown well I don't recommend using this
setting<00:01:28.840><c> unless</c><00:01:29.119><c> you</c><00:01:29.240><c> want</c><00:01:29.360><c> to</c><00:01:29.479><c> stretch</c><00:01:29.759><c> your</c>
00:01:29.950 --> 00:01:29.960 align:start position:0%
setting unless you want to stretch your
00:01:29.960 --> 00:01:32.469 align:start position:0%
setting unless you want to stretch your
your<00:01:30.079><c> GPU</c><00:01:30.439><c> to</c><00:01:30.600><c> the</c><00:01:30.759><c> max</c><00:01:31.479><c> you</c><00:01:31.640><c> can</c><00:01:31.880><c> now</c><00:01:32.040><c> render</c>
00:01:32.469 --> 00:01:32.479 align:start position:0%
your GPU to the max you can now render
00:01:32.479 --> 00:01:34.310 align:start position:0%
your GPU to the max you can now render
vertical<00:01:32.960><c> structures</c><00:01:33.439><c> like</c><00:01:33.640><c> pixelart</c><00:01:34.159><c> with</c>
00:01:34.310 --> 00:01:34.320 align:start position:0%
vertical structures like pixelart with
00:01:34.320 --> 00:01:38.429 align:start position:0%
vertical structures like pixelart with
almost<00:01:34.680><c> no</c><00:01:34.920><c> quality</c>
00:01:38.429 --> 00:01:38.439 align:start position:0%
00:01:38.439 --> 00:01:40.990 align:start position:0%
loss<00:01:39.439><c> along</c><00:01:39.759><c> with</c><00:01:39.920><c> all</c><00:01:40.200><c> those</c><00:01:40.399><c> new</c><00:01:40.640><c> visual</c>
00:01:40.990 --> 00:01:41.000 align:start position:0%
loss along with all those new visual
00:01:41.000 --> 00:01:43.230 align:start position:0%
loss along with all those new visual
changes<00:01:41.640><c> there</c><00:01:41.759><c> were</c><00:01:42.040><c> several</c><00:01:42.479><c> large</c><00:01:42.840><c> backend</c>
00:01:43.230 --> 00:01:43.240 align:start position:0%
changes there were several large backend
00:01:43.240 --> 00:01:45.590 align:start position:0%
changes there were several large backend
changes<00:01:43.640><c> as</c><00:01:43.799><c> well</c><00:01:44.520><c> the</c><00:01:44.680><c> largest</c><00:01:45.040><c> of</c><00:01:45.240><c> which</c><00:01:45.439><c> was</c>
00:01:45.590 --> 00:01:45.600 align:start position:0%
changes as well the largest of which was
00:01:45.600 --> 00:01:48.190 align:start position:0%
changes as well the largest of which was
the<00:01:45.880><c> change</c><00:01:46.159><c> to</c><00:01:46.360><c> dh's</c><00:01:47.040><c> database</c><00:01:47.520><c> format</c><00:01:48.040><c> to</c>
00:01:48.190 --> 00:01:48.200 align:start position:0%
the change to dh's database format to
00:01:48.200 --> 00:01:50.990 align:start position:0%
the change to dh's database format to
address<00:01:48.560><c> two</c><00:01:48.799><c> major</c><00:01:49.159><c> issues</c><00:01:50.159><c> but</c><00:01:50.320><c> don't</c><00:01:50.520><c> worry</c>
00:01:50.990 --> 00:01:51.000 align:start position:0%
address two major issues but don't worry
00:01:51.000 --> 00:01:52.830 align:start position:0%
address two major issues but don't worry
you<00:01:51.079><c> won't</c><00:01:51.320><c> have</c><00:01:51.439><c> to</c><00:01:51.560><c> regenerate</c><00:01:52.119><c> anything</c>
00:01:52.830 --> 00:01:52.840 align:start position:0%
you won't have to regenerate anything
00:01:52.840 --> 00:01:54.429 align:start position:0%
you won't have to regenerate anything
just<00:01:53.000><c> launch</c><00:01:53.280><c> your</c><00:01:53.439><c> world</c><00:01:53.719><c> and</c><00:01:53.920><c> DH</c><00:01:54.280><c> will</c>
00:01:54.429 --> 00:01:54.439 align:start position:0%
just launch your world and DH will
00:01:54.439 --> 00:01:57.069 align:start position:0%
just launch your world and DH will
automatically<00:01:55.000><c> migrate</c><00:01:55.320><c> to</c><00:01:55.439><c> the</c><00:01:55.560><c> new</c><00:01:56.079><c> version</c>
00:01:57.069 --> 00:01:57.079 align:start position:0%
automatically migrate to the new version
00:01:57.079 --> 00:01:58.910 align:start position:0%
automatically migrate to the new version
just<00:01:57.360><c> be</c><00:01:57.520><c> aware</c><00:01:57.799><c> that</c><00:01:57.920><c> it</c><00:01:58.039><c> will</c><00:01:58.280><c> take</c><00:01:58.439><c> a</c><00:01:58.600><c> while</c>
00:01:58.910 --> 00:01:58.920 align:start position:0%
just be aware that it will take a while
00:01:58.920 --> 00:02:00.749 align:start position:0%
just be aware that it will take a while
if<00:01:59.000><c> you</c><00:01:59.119><c> generated</c><00:01:59.560><c> a</c><00:01:59.600><c> lot</c><00:01:59.719><c> of</c><00:02:00.000><c> lods</c><00:02:00.439><c> and</c><00:02:00.600><c> have</c>
00:02:00.749 --> 00:02:00.759 align:start position:0%
if you generated a lot of lods and have
00:02:00.759 --> 00:02:02.950 align:start position:0%
if you generated a lot of lods and have
a<00:02:00.920><c> large</c>
00:02:02.950 --> 00:02:02.960 align:start position:0%
a large
00:02:02.960 --> 00:02:05.550 align:start position:0%
a large
database<00:02:03.960><c> one</c><00:02:04.119><c> of</c><00:02:04.360><c> those</c><00:02:04.600><c> issues</c><00:02:05.200><c> was</c><00:02:05.399><c> with</c>
00:02:05.550 --> 00:02:05.560 align:start position:0%
database one of those issues was with
00:02:05.560 --> 00:02:07.709 align:start position:0%
database one of those issues was with
World<00:02:05.840><c> gen</c><00:02:06.520><c> the</c><00:02:06.640><c> old</c><00:02:06.880><c> format</c><00:02:07.280><c> had</c><00:02:07.399><c> trouble</c>
00:02:07.709 --> 00:02:07.719 align:start position:0%
World gen the old format had trouble
00:02:07.719 --> 00:02:09.790 align:start position:0%
World gen the old format had trouble
determining<00:02:08.319><c> which</c><00:02:08.479><c> lods</c><00:02:09.039><c> were</c><00:02:09.319><c> or</c><00:02:09.479><c> weren't</c>
00:02:09.790 --> 00:02:09.800 align:start position:0%
determining which lods were or weren't
00:02:09.800 --> 00:02:11.949 align:start position:0%
determining which lods were or weren't
generated<00:02:10.679><c> which</c><00:02:10.920><c> caused</c><00:02:11.319><c> problems</c><00:02:11.680><c> like</c>
00:02:11.949 --> 00:02:11.959 align:start position:0%
generated which caused problems like
00:02:11.959 --> 00:02:15.589 align:start position:0%
generated which caused problems like
this<00:02:12.800><c> or</c><00:02:13.120><c> generating</c><00:02:13.560><c> areas</c><00:02:14.120><c> twice</c><00:02:15.120><c> luckily</c>
00:02:15.589 --> 00:02:15.599 align:start position:0%
this or generating areas twice luckily
00:02:15.599 --> 00:02:17.110 align:start position:0%
this or generating areas twice luckily
those<00:02:15.879><c> problems</c><00:02:16.120><c> are</c><00:02:16.319><c> both</c><00:02:16.519><c> solved</c><00:02:16.879><c> with</c><00:02:17.000><c> the</c>
00:02:17.110 --> 00:02:17.120 align:start position:0%
those problems are both solved with the
00:02:17.120 --> 00:02:19.790 align:start position:0%
those problems are both solved with the
new<00:02:17.319><c> system</c><00:02:18.280><c> and</c><00:02:18.440><c> as</c><00:02:18.560><c> a</c><00:02:18.720><c> nice</c><00:02:18.920><c> bonus</c><00:02:19.400><c> the</c><00:02:19.480><c> world</c>
00:02:19.790 --> 00:02:19.800 align:start position:0%
new system and as a nice bonus the world
00:02:19.800 --> 00:02:21.470 align:start position:0%
new system and as a nice bonus the world
generator<00:02:20.239><c> now</c><00:02:20.440><c> handles</c><00:02:20.800><c> extreme</c><00:02:21.120><c> render</c>
00:02:21.470 --> 00:02:21.480 align:start position:0%
generator now handles extreme render
00:02:21.480 --> 00:02:24.110 align:start position:0%
generator now handles extreme render
distances<00:02:22.120><c> much</c><00:02:22.360><c> better</c><00:02:23.360><c> so</c><00:02:23.599><c> if</c><00:02:23.720><c> you</c><00:02:23.879><c> want</c><00:02:24.000><c> to</c>
00:02:24.110 --> 00:02:24.120 align:start position:0%
distances much better so if you want to
00:02:24.120 --> 00:02:25.830 align:start position:0%
distances much better so if you want to
wait<00:02:24.319><c> the</c><00:02:24.440><c> 30</c><00:02:24.760><c> hours</c><00:02:25.080><c> to</c><00:02:25.239><c> generate</c><00:02:25.599><c> all</c><00:02:25.760><c> the</c>
00:02:25.830 --> 00:02:25.840 align:start position:0%
wait the 30 hours to generate all the
00:02:25.840 --> 00:02:28.710 align:start position:0%
wait the 30 hours to generate all the
way<00:02:25.959><c> out</c><00:02:26.080><c> to</c><00:02:26.239><c> 1024</c><00:02:26.840><c> render</c><00:02:27.200><c> distance</c><00:02:28.040><c> DH</c><00:02:28.519><c> will</c>
00:02:28.710 --> 00:02:28.720 align:start position:0%
way out to 1024 render distance DH will
00:02:28.720 --> 00:02:31.990 align:start position:0%
way out to 1024 render distance DH will
work<00:02:29.120><c> much</c><00:02:29.400><c> better</c>
00:02:31.990 --> 00:02:32.000 align:start position:0%
00:02:32.000 --> 00:02:33.790 align:start position:0%
along<00:02:32.239><c> with</c><00:02:32.360><c> the</c><00:02:32.480><c> new</c><00:02:32.640><c> world</c><00:02:32.879><c> gen</c><00:02:33.160><c> handling</c><00:02:33.640><c> we</c>
00:02:33.790 --> 00:02:33.800 align:start position:0%
along with the new world gen handling we
00:02:33.800 --> 00:02:35.710 align:start position:0%
along with the new world gen handling we
have<00:02:33.959><c> new</c><00:02:34.200><c> lossy</c><00:02:34.760><c> and</c><00:02:34.959><c> lossless</c><00:02:35.480><c> data</c>
00:02:35.710 --> 00:02:35.720 align:start position:0%
have new lossy and lossless data
00:02:35.720 --> 00:02:37.670 align:start position:0%
have new lossy and lossless data
compression<00:02:36.560><c> which</c><00:02:36.800><c> combined</c><00:02:37.239><c> can</c><00:02:37.360><c> reduce</c>
00:02:37.670 --> 00:02:37.680 align:start position:0%
compression which combined can reduce
00:02:37.680 --> 00:02:40.670 align:start position:0%
compression which combined can reduce
file<00:02:38.080><c> sizes</c><00:02:38.440><c> to</c><00:02:38.680><c> onethird</c><00:02:39.400><c> the</c><00:02:39.599><c> size</c><00:02:39.920><c> of</c>
00:02:40.670 --> 00:02:40.680 align:start position:0%
file sizes to onethird the size of
00:02:40.680 --> 00:02:42.949 align:start position:0%
file sizes to onethird the size of
dh2<00:02:41.680><c> just</c><00:02:41.840><c> be</c><00:02:41.959><c> aware</c><00:02:42.239><c> that</c><00:02:42.400><c> this</c><00:02:42.519><c> reduction</c>
00:02:42.949 --> 00:02:42.959 align:start position:0%
dh2 just be aware that this reduction
00:02:42.959 --> 00:02:44.990 align:start position:0%
dh2 just be aware that this reduction
won't<00:02:43.200><c> be</c><00:02:43.319><c> seen</c><00:02:43.560><c> for</c><00:02:43.760><c> old</c><00:02:44.000><c> migrated</c><00:02:44.480><c> worlds</c>
00:02:44.990 --> 00:02:45.000 align:start position:0%
won't be seen for old migrated worlds
00:02:45.000 --> 00:02:46.630 align:start position:0%
won't be seen for old migrated worlds
because<00:02:45.239><c> the</c><00:02:45.360><c> process</c><00:02:45.680><c> to</c><00:02:45.920><c> vacuum</c><00:02:46.239><c> a</c><00:02:46.360><c> large</c>
00:02:46.630 --> 00:02:46.640 align:start position:0%
because the process to vacuum a large
00:02:46.640 --> 00:02:49.030 align:start position:0%
because the process to vacuum a large
database<00:02:47.040><c> can</c><00:02:47.200><c> take</c><00:02:47.480><c> tens</c><00:02:47.760><c> of</c><00:02:47.959><c> minutes</c><00:02:48.800><c> and</c><00:02:48.920><c> we</c>
00:02:49.030 --> 00:02:49.040 align:start position:0%
database can take tens of minutes and we
00:02:49.040 --> 00:02:50.550 align:start position:0%
database can take tens of minutes and we
don't<00:02:49.200><c> want</c><00:02:49.280><c> to</c><00:02:49.440><c> make</c><00:02:49.599><c> you</c><00:02:49.800><c> wait</c><00:02:50.080><c> that</c><00:02:50.239><c> long</c><00:02:50.440><c> to</c>
00:02:50.550 --> 00:02:50.560 align:start position:0%
don't want to make you wait that long to
00:02:50.560 --> 00:02:52.110 align:start position:0%
don't want to make you wait that long to
load<00:02:50.800><c> into</c><00:02:51.000><c> a</c>
00:02:52.110 --> 00:02:52.120 align:start position:0%
load into a
00:02:52.120 --> 00:02:54.270 align:start position:0%
load into a
world<00:02:53.120><c> continuing</c><00:02:53.640><c> with</c><00:02:53.760><c> the</c><00:02:53.920><c> backend</c>
00:02:54.270 --> 00:02:54.280 align:start position:0%
world continuing with the backend
00:02:54.280 --> 00:02:55.910 align:start position:0%
world continuing with the backend
changes<00:02:54.920><c> we</c><00:02:55.040><c> have</c><00:02:55.159><c> a</c><00:02:55.280><c> few</c><00:02:55.519><c> performance</c>
00:02:55.910 --> 00:02:55.920 align:start position:0%
changes we have a few performance
00:02:55.920 --> 00:02:57.309 align:start position:0%
changes we have a few performance
improvements<00:02:56.360><c> y'all</c><00:02:56.560><c> will</c><00:02:56.680><c> be</c><00:02:56.840><c> very</c><00:02:57.000><c> excited</c>
00:02:57.309 --> 00:02:57.319 align:start position:0%
improvements y'all will be very excited
00:02:57.319 --> 00:03:00.070 align:start position:0%
improvements y'all will be very excited
to<00:02:57.440><c> hear</c><00:02:57.599><c> about</c><00:02:58.599><c> DH</c><00:02:59.040><c> is</c><00:02:59.200><c> now</c><00:02:59.360><c> significant</c><00:03:00.000><c> L</c>
00:03:00.070 --> 00:03:00.080 align:start position:0%
to hear about DH is now significant L
00:03:00.080 --> 00:03:02.670 align:start position:0%
to hear about DH is now significant L
more<00:03:00.200><c> memory</c><00:03:00.519><c> efficient</c><00:03:01.440><c> you</c><00:03:01.560><c> can</c><00:03:01.720><c> run</c><00:03:02.040><c> 512</c>
00:03:02.670 --> 00:03:02.680 align:start position:0%
more memory efficient you can run 512
00:03:02.680 --> 00:03:04.390 align:start position:0%
more memory efficient you can run 512
render<00:03:03.000><c> distance</c><00:03:03.760><c> assuming</c><00:03:04.080><c> you've</c><00:03:04.239><c> already</c>
00:03:04.390 --> 00:03:04.400 align:start position:0%
render distance assuming you've already
00:03:04.400 --> 00:03:05.949 align:start position:0%
render distance assuming you've already
waited<00:03:04.640><c> the</c><00:03:04.720><c> 8</c><00:03:04.920><c> hours</c><00:03:05.159><c> needed</c><00:03:05.400><c> to</c><00:03:05.480><c> generate</c><00:03:05.799><c> it</c>
00:03:05.949 --> 00:03:05.959 align:start position:0%
waited the 8 hours needed to generate it
00:03:05.959 --> 00:03:09.350 align:start position:0%
waited the 8 hours needed to generate it
all<00:03:06.599><c> with</c><00:03:06.720><c> only</c><00:03:06.920><c> 2</c><00:03:07.159><c> GB</c><00:03:07.519><c> of</c><00:03:07.920><c> memory</c><00:03:08.920><c> although</c>
00:03:09.350 --> 00:03:09.360 align:start position:0%
all with only 2 GB of memory although
00:03:09.360 --> 00:03:11.390 align:start position:0%
all with only 2 GB of memory although
I'd<00:03:09.560><c> still</c><00:03:09.840><c> recommend</c><00:03:10.239><c> four</c><00:03:10.519><c> or</c><00:03:10.760><c> more</c>
00:03:11.390 --> 00:03:11.400 align:start position:0%
I'd still recommend four or more
00:03:11.400 --> 00:03:12.750 align:start position:0%
I'd still recommend four or more
especially<00:03:11.799><c> if</c><00:03:11.879><c> you</c><00:03:12.000><c> want</c><00:03:12.120><c> to</c><00:03:12.239><c> run</c><00:03:12.400><c> the</c><00:03:12.519><c> world</c>
00:03:12.750 --> 00:03:12.760 align:start position:0%
especially if you want to run the world
00:03:12.760 --> 00:03:14.710 align:start position:0%
especially if you want to run the world
generator<00:03:13.560><c> since</c><00:03:13.840><c> that</c><00:03:14.000><c> uses</c><00:03:14.319><c> Minecraft</c>
00:03:14.710 --> 00:03:14.720 align:start position:0%
generator since that uses Minecraft
00:03:14.720 --> 00:03:16.630 align:start position:0%
generator since that uses Minecraft
world<00:03:14.959><c> gen</c><00:03:15.200><c> code</c><00:03:15.640><c> which</c><00:03:15.799><c> is</c><00:03:16.000><c> still</c><00:03:16.360><c> pretty</c>
00:03:16.630 --> 00:03:16.640 align:start position:0%
world gen code which is still pretty
00:03:16.640 --> 00:03:19.509 align:start position:0%
world gen code which is still pretty
memory
00:03:19.509 --> 00:03:19.519 align:start position:0%
00:03:19.519 --> 00:03:22.350 align:start position:0%
hungry<00:03:20.519><c> lastly</c><00:03:21.040><c> but</c><00:03:21.159><c> certainly</c><00:03:21.519><c> not</c><00:03:21.760><c> least</c>
00:03:22.350 --> 00:03:22.360 align:start position:0%
hungry lastly but certainly not least
00:03:22.360 --> 00:03:24.149 align:start position:0%
hungry lastly but certainly not least
thanks<00:03:22.560><c> to</c><00:03:22.720><c> null's</c><00:03:23.159><c> hard</c><00:03:23.360><c> work</c><00:03:23.680><c> we</c><00:03:23.879><c> now</c><00:03:24.040><c> have</c>
00:03:24.149 --> 00:03:24.159 align:start position:0%
thanks to null's hard work we now have
00:03:24.159 --> 00:03:25.990 align:start position:0%
thanks to null's hard work we now have
frustum<00:03:24.599><c> calling</c><00:03:25.319><c> which</c><00:03:25.480><c> means</c><00:03:25.680><c> you</c><00:03:25.799><c> can</c>
00:03:25.990 --> 00:03:26.000 align:start position:0%
frustum calling which means you can
00:03:26.000 --> 00:03:29.010 align:start position:0%
frustum calling which means you can
expect<00:03:26.280><c> a</c><00:03:26.519><c> significant</c><00:03:27.120><c> FPS</c><00:03:27.560><c> Improvement</c>
00:03:29.010 --> 00:03:29.020 align:start position:0%
expect a significant FPS Improvement
00:03:29.020 --> 00:03:30.750 align:start position:0%
expect a significant FPS Improvement
[Music]
00:03:30.750 --> 00:03:30.760 align:start position:0%
[Music]
00:03:30.760 --> 00:03:32.270 align:start position:0%
[Music]
apologies<00:03:31.200><c> for</c><00:03:31.360><c> the</c><00:03:31.480><c> long</c><00:03:31.720><c> time</c><00:03:31.959><c> between</c>
00:03:32.270 --> 00:03:32.280 align:start position:0%
apologies for the long time between
00:03:32.280 --> 00:03:34.270 align:start position:0%
apologies for the long time between
updates<00:03:33.000><c> I</c><00:03:33.080><c> was</c><00:03:33.239><c> hoping</c><00:03:33.480><c> to</c><00:03:33.599><c> have</c><00:03:33.720><c> a</c><00:03:33.879><c> smaller</c>
00:03:34.270 --> 00:03:34.280 align:start position:0%
updates I was hoping to have a smaller
00:03:34.280 --> 00:03:36.710 align:start position:0%
updates I was hoping to have a smaller
update<00:03:34.599><c> out</c><00:03:34.799><c> much</c><00:03:35.000><c> sooner</c><00:03:35.840><c> but</c><00:03:36.080><c> the</c><00:03:36.159><c> world</c><00:03:36.439><c> gen</c>
00:03:36.710 --> 00:03:36.720 align:start position:0%
update out much sooner but the world gen
00:03:36.720 --> 00:03:38.309 align:start position:0%
update out much sooner but the world gen
and<00:03:36.879><c> file</c><00:03:37.159><c> size</c><00:03:37.400><c> issues</c><00:03:37.760><c> ended</c><00:03:37.959><c> up</c><00:03:38.080><c> being</c>
00:03:38.309 --> 00:03:38.319 align:start position:0%
and file size issues ended up being
00:03:38.319 --> 00:03:40.070 align:start position:0%
and file size issues ended up being
something<00:03:38.599><c> I</c><00:03:38.720><c> couldn't</c><00:03:39.040><c> ignore</c><00:03:39.599><c> which</c><00:03:39.840><c> both</c>
00:03:40.070 --> 00:03:40.080 align:start position:0%
something I couldn't ignore which both
00:03:40.080 --> 00:03:41.949 align:start position:0%
something I couldn't ignore which both
required<00:03:40.599><c> major</c><00:03:40.959><c> changes</c><00:03:41.360><c> that</c><00:03:41.480><c> took</c><00:03:41.680><c> months</c>
00:03:41.949 --> 00:03:41.959 align:start position:0%
required major changes that took months
00:03:41.959 --> 00:03:44.550 align:start position:0%
required major changes that took months
to<00:03:42.280><c> finish</c><00:03:43.280><c> it</c><00:03:43.400><c> would</c><00:03:43.519><c> have</c><00:03:43.640><c> been</c><00:03:43.840><c> much</c><00:03:44.120><c> faster</c>
00:03:44.550 --> 00:03:44.560 align:start position:0%
to finish it would have been much faster
00:03:44.560 --> 00:03:46.229 align:start position:0%
to finish it would have been much faster
if<00:03:44.680><c> I</c><00:03:44.760><c> could</c><00:03:44.920><c> do</c><00:03:45.040><c> this</c>
00:03:46.229 --> 00:03:46.239 align:start position:0%
if I could do this
00:03:46.239 --> 00:03:48.070 align:start position:0%
if I could do this
full-time
00:03:48.070 --> 00:03:48.080 align:start position:0%
full-time
00:03:48.080 --> 00:03:54.830 align:start position:0%
full-time
H<00:03:49.080><c> hey</c><00:03:49.319><c> Mojang</c><00:03:50.319><c> are</c><00:03:50.439><c> you</c><00:03:50.640><c> hiring</c>
00:03:54.830 --> 00:03:54.840 align:start position:0%
00:03:54.840 --> 00:04:25.870 align:start position:0%
[Music]
00:04:25.870 --> 00:04:25.880 align:start position:0%
[Music]
00:04:25.880 --> 00:04:28.189 align:start position:0%
[Music]
I'm<00:04:26.880><c> call</c><00:04:27.199><c> me</c>
00:04:28.189 --> 00:04:28.199 align:start position:0%
I'm call me
00:04:28.199 --> 00:04:32.880 align:start position:0%
I'm call me
down<00:04:29.199><c> so</c><00:04:29.880><c> more</c>

403
package-lock.json generated
View File

@ -23,7 +23,7 @@
"simple-get": "^4.0.1",
"stripe": "^15.7.0",
"tsc": "^2.0.4",
"youtube-dl-exec": "^3.0.2",
"ytdl-core": "^4.11.5",
"zod": "^3.22.4"
},
"devDependencies": {
@ -923,15 +923,6 @@
"dev": true,
"license": "BSD-3-Clause"
},
"node_modules/@jclem/logfmt2": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/@jclem/logfmt2/-/logfmt2-2.4.3.tgz",
"integrity": "sha512-d7zluLlx+JRtVICF0+ghcrVdXBdE3eXrpIuFdcCcWxA3ABOyemkTySG4ha2AdsWFwAnh8tkB1vtyeZsWAbLumg==",
"engines": {
"node": ">= 14.x",
"npm": ">= 7.x"
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
@ -996,14 +987,6 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
"node_modules/@kikobeats/time-span": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@kikobeats/time-span/-/time-span-1.0.5.tgz",
"integrity": "sha512-txRAdmi35N1wnsLS1AO5mTlbY5Cv5/61WXqek2y3L9Q7u4mgdUVq819so5xe753hL5gYeLzlWoJ/VJfXg9nx8g==",
"engines": {
"node": ">= 18"
}
},
"node_modules/@neondatabase/serverless": {
"version": "0.9.3",
"resolved": "https://registry.npmjs.org/@neondatabase/serverless/-/serverless-0.9.3.tgz",
@ -2128,23 +2111,6 @@
"node": "*"
}
},
"node_modules/bin-version-check": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-6.0.0.tgz",
"integrity": "sha512-k9TS/pADINX9UlErjAkbkxDer8C+WlguMwySI8sLMGLUMDvwuHmDx00yoHe7nxshgwtLBcMWQgrlwjzscUeQKg==",
"deprecated": "Renamed to binary-version-check: https://www.npmjs.com/package/binary-version-check",
"dependencies": {
"binary-version": "^7.1.0",
"semver": "^7.6.0",
"semver-truncate": "^3.0.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/binary-extensions": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
@ -2155,145 +2121,6 @@
"node": ">=8"
}
},
"node_modules/binary-version": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/binary-version/-/binary-version-7.1.0.tgz",
"integrity": "sha512-Iy//vPc3ANPNlIWd242Npqc8MK0a/i4kVcHDlDA6HNMv5zMxz4ulIFhOSYJVKw/8AbHdHy0CnGYEt1QqSXxPsw==",
"dependencies": {
"execa": "^8.0.1",
"find-versions": "^6.0.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/binary-version/node_modules/execa": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
"integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
"dependencies": {
"cross-spawn": "^7.0.3",
"get-stream": "^8.0.1",
"human-signals": "^5.0.0",
"is-stream": "^3.0.0",
"merge-stream": "^2.0.0",
"npm-run-path": "^5.1.0",
"onetime": "^6.0.0",
"signal-exit": "^4.1.0",
"strip-final-newline": "^3.0.0"
},
"engines": {
"node": ">=16.17"
},
"funding": {
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
"node_modules/binary-version/node_modules/get-stream": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
"integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/binary-version/node_modules/human-signals": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
"integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
"engines": {
"node": ">=16.17.0"
}
},
"node_modules/binary-version/node_modules/is-stream": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
"integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/binary-version/node_modules/mimic-fn": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
"integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/binary-version/node_modules/npm-run-path": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
"integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
"dependencies": {
"path-key": "^4.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/binary-version/node_modules/onetime": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
"integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
"dependencies": {
"mimic-fn": "^4.0.0"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/binary-version/node_modules/path-key": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
"integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/binary-version/node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/binary-version/node_modules/strip-final-newline": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
"integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/bplist-parser": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz",
@ -2647,17 +2474,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/convert-hrtime": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz",
"integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cookie": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
@ -2707,6 +2523,7 @@
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
@ -2721,20 +2538,13 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
"integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
"dev": true,
"license": "ISC",
"dependencies": {
"es5-ext": "^0.10.50",
"type": "^1.0.1"
}
},
"node_modules/dargs": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
"integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==",
"engines": {
"node": ">=8"
}
},
"node_modules/debug": {
"version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
@ -2752,32 +2562,6 @@
}
}
},
"node_modules/debug-fabulous": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-2.0.2.tgz",
"integrity": "sha512-XfAbX8/owqC+pjIg0/+3V1gp8TugJT7StX/TE1TYedjrRf7h7SgUAL/+gKoAQGPCLbSU5L5LPvDg4/cGn1E/WA==",
"dependencies": {
"debug": "^4",
"memoizee": "0.4"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/debug-logfmt": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/debug-logfmt/-/debug-logfmt-1.2.2.tgz",
"integrity": "sha512-MAPU+m9lzLMkxI8k6/kJ/MGLGNtHOsW8RHriLkRxe/jFFW2iXmiGGUG9aYTRIWo5ejOFqLB10HqZ6+TN4toQFQ==",
"dependencies": {
"@jclem/logfmt2": "~2.4.3",
"@kikobeats/time-span": "~1.0.2",
"debug-fabulous": "~2.0.2",
"pretty-ms": "~7.0.1"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/decompress-response": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
@ -3458,6 +3242,7 @@
"version": "0.10.62",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz",
"integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
"dev": true,
"hasInstallScript": true,
"license": "ISC",
"dependencies": {
@ -3473,6 +3258,7 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
"dev": true,
"license": "MIT",
"dependencies": {
"d": "1",
@ -3484,6 +3270,7 @@
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
"integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
"dev": true,
"license": "ISC",
"dependencies": {
"d": "^1.0.1",
@ -3494,6 +3281,7 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
"integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
"dev": true,
"license": "ISC",
"dependencies": {
"d": "1",
@ -4644,6 +4432,7 @@
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
"integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
"dev": true,
"license": "MIT",
"dependencies": {
"d": "1",
@ -4696,6 +4485,7 @@
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
"integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
"dev": true,
"license": "ISC",
"dependencies": {
"type": "^2.7.2"
@ -4705,6 +4495,7 @@
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
"integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==",
"dev": true,
"license": "ISC"
},
"node_modules/extend": {
@ -5038,21 +4829,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/find-versions": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/find-versions/-/find-versions-6.0.0.tgz",
"integrity": "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==",
"dependencies": {
"semver-regex": "^4.0.5",
"super-regex": "^1.0.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/flat-cache": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
@ -5181,17 +4957,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/function-timeout": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz",
"integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/function.prototype.name": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
@ -6154,6 +5919,7 @@
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
"integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==",
"dev": true,
"license": "MIT"
},
"node_modules/is-proto-prop": {
@ -6296,14 +6062,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-unix": {
"version": "2.0.10",
"resolved": "https://registry.npmjs.org/is-unix/-/is-unix-2.0.10.tgz",
"integrity": "sha512-CcasZSEOQUoE7JHy56se4wyRhdJfjohuMWYmceSTaDY4naKyd1fpLiY8rJsIT6AKfVstQAhHJOfPx7jcUxK61Q==",
"engines": {
"node": ">= 12"
}
},
"node_modules/is-weakref": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
@ -6351,6 +6109,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true,
"license": "ISC"
},
"node_modules/jest-worker": {
@ -6668,11 +6427,24 @@
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
"integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"es5-ext": "~0.10.2"
}
},
"node_modules/m3u8stream": {
"version": "0.8.6",
"resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz",
"integrity": "sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==",
"dependencies": {
"miniget": "^4.2.2",
"sax": "^1.2.4"
},
"engines": {
"node": ">=12"
}
},
"node_modules/mailtrap": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/mailtrap/-/mailtrap-3.3.0.tgz",
@ -6701,6 +6473,7 @@
"version": "0.4.15",
"resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz",
"integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"d": "^1.0.1",
@ -6737,6 +6510,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
"dev": true,
"license": "MIT"
},
"node_modules/merge2": {
@ -6821,6 +6595,14 @@
"node": ">=4"
}
},
"node_modules/miniget": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.3.tgz",
"integrity": "sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==",
"engines": {
"node": ">=12"
}
},
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@ -6902,6 +6684,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
"dev": true,
"license": "ISC"
},
"node_modules/node-domexception": {
@ -7270,14 +7053,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/parse-ms": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz",
"integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==",
"engines": {
"node": ">=6"
}
},
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@ -7302,6 +7077,7 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@ -7623,20 +7399,6 @@
"node": ">=6.0.0"
}
},
"node_modules/pretty-ms": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz",
"integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==",
"dependencies": {
"parse-ms": "^2.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
@ -8183,6 +7945,11 @@
"node": ">=10"
}
},
"node_modules/sax": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
"integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg=="
},
"node_modules/schema-utils": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
@ -8253,31 +8020,6 @@
"node": ">=10"
}
},
"node_modules/semver-regex": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz",
"integrity": "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/semver-truncate": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-3.0.0.tgz",
"integrity": "sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==",
"dependencies": {
"semver": "^7.3.5"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/serialize-javascript": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
@ -8329,6 +8071,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
@ -8341,6 +8084,7 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@ -8745,21 +8489,6 @@
"node": ">=12.*"
}
},
"node_modules/super-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.0.0.tgz",
"integrity": "sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==",
"dependencies": {
"function-timeout": "^1.0.1",
"time-span": "^5.1.0"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@ -8904,38 +8633,17 @@
"real-require": "^0.2.0"
}
},
"node_modules/time-span": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz",
"integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==",
"dependencies": {
"convert-hrtime": "^5.0.0"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/timers-ext": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
"integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
"dev": true,
"license": "ISC",
"dependencies": {
"es5-ext": "~0.10.46",
"next-tick": "1"
}
},
"node_modules/tinyspawn": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/tinyspawn/-/tinyspawn-1.2.13.tgz",
"integrity": "sha512-XZG5oVXMvbGzxggFzLebCAoXBqRsA2Ew/UsZUguOGhC2699uID6GTA5tcuW2GH3s/i/thFYDuPRyaG3A46LwgA==",
"engines": {
"node": ">= 18"
}
},
"node_modules/titleize": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz",
@ -9073,6 +8781,7 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
"dev": true,
"license": "ISC"
},
"node_modules/type-check": {
@ -9454,6 +9163,7 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
@ -9738,20 +9448,17 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/youtube-dl-exec": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/youtube-dl-exec/-/youtube-dl-exec-3.0.2.tgz",
"integrity": "sha512-kSNss5pkiZ7nXqh13m8pw1Os5s4t81RkpsZ7YozaJYVUDFrSXWKtvzhfaJ8dJH7QiK5qbeiuWs2z86lLuzMkRA==",
"hasInstallScript": true,
"node_modules/ytdl-core": {
"version": "4.11.5",
"resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.11.5.tgz",
"integrity": "sha512-27LwsW4n4nyNviRCO1hmr8Wr5J1wLLMawHCQvH8Fk0hiRqrxuIu028WzbJetiYH28K8XDbeinYW4/wcHQD1EXA==",
"dependencies": {
"bin-version-check": "~6.0.0",
"dargs": "~7.0.0",
"debug-logfmt": "~1.2.2",
"is-unix": "~2.0.10",
"tinyspawn": "~1.2.9"
"m3u8stream": "^0.8.6",
"miniget": "^4.2.2",
"sax": "^1.1.3"
},
"engines": {
"node": ">= 18"
"node": ">=12"
}
},
"node_modules/zod": {

View File

@ -44,7 +44,7 @@
"simple-get": "^4.0.1",
"stripe": "^15.7.0",
"tsc": "^2.0.4",
"youtube-dl-exec": "^3.0.2",
"ytdl-core": "^4.11.5",
"zod": "^3.22.4"
},
"xo": {

View File

@ -1,6 +1,6 @@
import { initDb } from "./db/index.js";
import { channelRoutes, authRoutes, videoRoutes, meRoutes, blogRoutes, dashboardRoutes } from "./routes/index.js";
import { env, Logger, Redis } from "./utils/index.js";
import { env, Logger } from "./utils/index.js";
import fastify from "fastify";
import { middleware } from "./modules/middleware.js";
import oauth from '@fastify/oauth2';

View File

@ -4,8 +4,7 @@ import { and, desc, eq, getTableColumns, sql } from "drizzle-orm";
import { db } from "../db/index.js";
import { articles, articles as articlesTable, signups as signupsTable, sites, users } from "../db/schemas.js";
import { authMiddleware, authMiddlewareFn } from "../modules/middleware.js";
import { jsonToCsv, getAccessToken, getVideoCaptions, getCaptionText, parseTextFromCaptions, createBlogFromCaptions, createArticleSlug, getVideoById, env } from "../utils/index.js";
import youtubeDl from "youtube-dl-exec";
import { jsonToCsv, createBlogFromCaptions, createArticleSlug, getVideoById, env, getWhisperCaptions, getVideoWithCaptions } from "../utils/index.js";
/**
*
@ -215,7 +214,7 @@ export const dashboardRoutes = (fastify, _, done) => {
return;
}
const access_token = await getAccessToken(fastify, req);
// const access_token = await getAccessToken(fastify, req);
let urlRegex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/;
let match = req.body.video_id.match(urlRegex);
@ -229,30 +228,16 @@ export const dashboardRoutes = (fastify, _, done) => {
// youtube-dl --write-sub --sub-lang en --skip-download URL
const result = await youtubeDl(req.body.video_id, {
skipDownload: true,
writeAutoSub: true,
subLang: "en",
dumpSingleJson: true,
});
const captions = await (await fetch(result.automatic_captions.en.find(x=>x.ext==="srv1").url)).text();
const caption_text = convertSRV1ToPlainText(captions);
// const captions = await getVideoCaptions(access_token, req.body.video_id);
// const preferred_caption_id = captions.find(x => x.snippet.language == 'en').id;
const video_data = await getVideoWithCaptions(req.body.video_id);
reply.send({
success: true
});
// const caption_body = await getCaptionText(access_token, preferred_caption_id);
// const caption_text = parseTextFromCaptions(caption_body).substring(28);
// const caption_text
// const video_data = await getVideoById(access_token, req.body.video_id);
const video_data = await getVideoById(access_token, req.body.video_id);
const blog_content_json = await createBlogFromCaptions(caption_text, { title: video_data.title, description: video_data.description }, req.body);
const blog_content_json = await createBlogFromCaptions(video_data.captions, { title: video_data.title, description: video_data.description }, req.body);
// TODO: once I add multiple sites per user, this should come from the client
const site = await db.select().from(sites).where(eq(sites.user_id, req.session.user_id));

View File

@ -1,6 +1,8 @@
const defaultModel = '@hf/mistralai/mistral-7b-instruct-v0.2';
import OpenAI from "openai";
import OpenAI, { toFile } from "openai";
import { env } from "./env.js";
import ytdl from "ytdl-core";
import { PassThrough } from "stream";
const openai = new OpenAI({
apiKey: env.OPENAI_TOKEN
@ -83,7 +85,7 @@ export async function createBlogFromCaptions(captions, {
"role": "system",
"content": `You are a "GPT" a version of ChatGPT that has been customized for a specific use case. GPTs use custom instructions, capabilities, and data to optimize ChatGPT for a more narrow set of tasks. You yourself are a GPT created by a user, and your name is Write For Me. Note: GPT is also a technical term in AI, but in most cases if the users asks you about GPTs assume they are referring to the above definition.
Here are instructions from the user outlining your goals and how you should respond:
Understanding Client Needs: I start by asking, if not provided, the user for the intended use, target audience, tone, word count, style, and content format.
Don't ask follow-up questions.
Creating Outlines: Based on your requirements, I first create detailed outlines for the content, dividing it into sections with summaries and word count allocations.
@ -102,7 +104,7 @@ export async function createBlogFromCaptions(captions, {
I approach tasks with a problem-solving mindset, aiming to address your specific needs and challenges in content creation`
}, {
role: "user",
content: `Write me a blog post of around ${length} words based on a youtube video. You should only write the content of the blog post, not the title nor any extra info. Only the content. The video information is as follows:
content: `Write me a blog post of around ${length || 500} words based on a youtube video. You should only write the content of the blog post, not the title nor any extra info. Only the content. The video information is as follows:
Title: ${title}
Captions:
${captions}`
@ -117,8 +119,8 @@ export async function createBlogFromCaptions(captions, {
let final = await openai.chat.completions.create({
model: "gpt-3.5-turbo",
messages: [...basePrompt, {"role": "assistant", "content": response.choices[0].message.content}, {"role": "user", "content": "Respond only in JSON with the following format: { meta_title: string, meta_desc: string, slug: string, excerp: string, title: string }"}],
response_format: {type: "json_object"}
messages: [...basePrompt, { "role": "assistant", "content": response.choices[0].message.content }, { "role": "user", "content": "Respond only in JSON with the following format: { meta_title: string, meta_desc: string, slug: string, excerp: string, title: string }" }],
response_format: { type: "json_object" }
})
console.log("second response", final.choices[0].message.content)
@ -132,3 +134,56 @@ export async function createBlogFromCaptions(captions, {
function wordsToTokens(n) {
return Math.ceil(n / 0.75);
}
export async function getWhisperCaptions(video_url) {
const audio = await getYouTubeAudioBuffer(video_url);
const file = await toFile(audio, "audio.mp3");
const res = await openai.audio.transcriptions.create({
file: file,
model: "whisper-1",
}).catch(x=>console.log(x));
return res.text;
}
/**
* Fetches the audio data from a YouTube video URL and returns it as a buffer.
* @param {string} videoUrl - The YouTube video URL.
* @returns {Promise<Buffer>} A promise that resolves with the audio data as a buffer.
*/
function getYouTubeAudioBuffer(videoUrl) {
return new Promise((resolve, reject) => {
// Download audio from YouTube
const audioStream = ytdl(videoUrl, { filter: "audioonly", quality: "lowestaudio" });
// Create a PassThrough stream to hold the audio data in memory
const passThrough = new PassThrough();
// Pipe the audio stream to the PassThrough stream
audioStream.pipe(passThrough);
// Collect the audio data into a buffer
let audioDataBuffer = [];
// Listen for data events on the PassThrough stream
passThrough.on('data', chunk => {
audioDataBuffer.push(chunk);
});
// Listen for end event to indicate the stream has finished
passThrough.on('end', () => {
// Convert the collected chunks into a single Buffer
const audioBufferData = Buffer.concat(audioDataBuffer);
// Resolve the promise with the audio data buffer
resolve(audioBufferData);
});
// Listen for error event on the PassThrough stream
passThrough.on('error', err => {
// Reject the promise if an error occurs
reject(err);
});
});
}

View File

@ -2,6 +2,8 @@ import { eq } from 'drizzle-orm';
import { db } from '../db/index.js';
import { sessions } from '../db/schemas.js';
import { google } from 'googleapis';
import ytdl from 'ytdl-core';
import { getWhisperCaptions } from './ai.js';
const service = google.youtube("v3");
@ -165,3 +167,15 @@ export async function getAccessToken(fastify, request) {
return access_token;
}
export async function getVideoWithCaptions(video_url) {
if(!(ytdl.validateURL(video_url))) throw new Error("Invalid Youtube URL");
const info = await ytdl.getBasicInfo(video_url);
const captions = await getWhisperCaptions(video_url);
return {
title: info.videoDetails.title,
description: info.videoDetails.description,
captions
}
}

205
yarn.lock
View File

@ -53,15 +53,15 @@
"@esbuild-kit/core-utils" "^3.0.0"
get-tsconfig "^4.4.0"
"@esbuild/win32-x64@0.17.19":
"@esbuild/linux-arm64@0.17.19":
version "0.17.19"
resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz"
integrity sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==
resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz"
integrity sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==
"@esbuild/win32-x64@0.19.12":
"@esbuild/linux-arm64@0.19.12":
version "0.19.12"
resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz"
integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==
resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz"
integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==
"@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
version "4.4.0"
@ -225,11 +225,6 @@
resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz"
integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==
"@jclem/logfmt2@~2.4.3":
version "2.4.3"
resolved "https://registry.npmjs.org/@jclem/logfmt2/-/logfmt2-2.4.3.tgz"
integrity sha512-d7zluLlx+JRtVICF0+ghcrVdXBdE3eXrpIuFdcCcWxA3ABOyemkTySG4ha2AdsWFwAnh8tkB1vtyeZsWAbLumg==
"@jridgewell/gen-mapping@^0.3.5":
version "0.3.5"
resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz"
@ -270,11 +265,6 @@
"@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14"
"@kikobeats/time-span@~1.0.2":
version "1.0.5"
resolved "https://registry.npmjs.org/@kikobeats/time-span/-/time-span-1.0.5.tgz"
integrity sha512-txRAdmi35N1wnsLS1AO5mTlbY5Cv5/61WXqek2y3L9Q7u4mgdUVq819so5xe753hL5gYeLzlWoJ/VJfXg9nx8g==
"@neondatabase/serverless@>=0.1":
version "0.9.3"
resolved "https://registry.npmjs.org/@neondatabase/serverless/-/serverless-0.9.3.tgz"
@ -921,28 +911,11 @@ bignumber.js@^9.0.0:
resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz"
integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==
bin-version-check@~6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/bin-version-check/-/bin-version-check-6.0.0.tgz"
integrity sha512-k9TS/pADINX9UlErjAkbkxDer8C+WlguMwySI8sLMGLUMDvwuHmDx00yoHe7nxshgwtLBcMWQgrlwjzscUeQKg==
dependencies:
binary-version "^7.1.0"
semver "^7.6.0"
semver-truncate "^3.0.0"
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
binary-version@^7.1.0:
version "7.1.0"
resolved "https://registry.npmjs.org/binary-version/-/binary-version-7.1.0.tgz"
integrity sha512-Iy//vPc3ANPNlIWd242Npqc8MK0a/i4kVcHDlDA6HNMv5zMxz4ulIFhOSYJVKw/8AbHdHy0CnGYEt1QqSXxPsw==
dependencies:
execa "^8.0.1"
find-versions "^6.0.0"
bplist-parser@^0.2.0:
version "0.2.0"
resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz"
@ -1163,11 +1136,6 @@ confusing-browser-globals@1.0.11:
resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz"
integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==
convert-hrtime@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz"
integrity sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==
cookie-signature@^1.1.0:
version "1.2.1"
resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.1.tgz"
@ -1205,29 +1173,6 @@ d@^1.0.1, d@1:
es5-ext "^0.10.50"
type "^1.0.1"
dargs@~7.0.0:
version "7.0.0"
resolved "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz"
integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==
debug-fabulous@~2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-2.0.2.tgz"
integrity sha512-XfAbX8/owqC+pjIg0/+3V1gp8TugJT7StX/TE1TYedjrRf7h7SgUAL/+gKoAQGPCLbSU5L5LPvDg4/cGn1E/WA==
dependencies:
debug "^4"
memoizee "0.4"
debug-logfmt@~1.2.2:
version "1.2.2"
resolved "https://registry.npmjs.org/debug-logfmt/-/debug-logfmt-1.2.2.tgz"
integrity sha512-MAPU+m9lzLMkxI8k6/kJ/MGLGNtHOsW8RHriLkRxe/jFFW2iXmiGGUG9aYTRIWo5ejOFqLB10HqZ6+TN4toQFQ==
dependencies:
"@jclem/logfmt2" "~2.4.3"
"@kikobeats/time-span" "~1.0.2"
debug-fabulous "~2.0.2"
pretty-ms "~7.0.1"
debug@^3.2.7:
version "3.2.7"
resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
@ -1235,7 +1180,7 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
debug@^4, debug@^4.0.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@4:
debug@^4.0.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@4:
version "4.3.4"
resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@ -1966,21 +1911,6 @@ execa@^7.1.1:
signal-exit "^3.0.7"
strip-final-newline "^3.0.0"
execa@^8.0.1:
version "8.0.1"
resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz"
integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==
dependencies:
cross-spawn "^7.0.3"
get-stream "^8.0.1"
human-signals "^5.0.0"
is-stream "^3.0.0"
merge-stream "^2.0.0"
npm-run-path "^5.1.0"
onetime "^6.0.0"
signal-exit "^4.1.0"
strip-final-newline "^3.0.0"
ext@^1.1.2:
version "1.7.0"
resolved "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz"
@ -2181,14 +2111,6 @@ find-up@^6.3.0:
locate-path "^7.1.0"
path-exists "^5.0.0"
find-versions@^6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/find-versions/-/find-versions-6.0.0.tgz"
integrity sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==
dependencies:
semver-regex "^4.0.5"
super-regex "^1.0.0"
flat-cache@^3.0.4:
version "3.2.0"
resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz"
@ -2252,11 +2174,6 @@ function-bind@^1.1.2:
resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
function-timeout@^1.0.1:
version "1.0.2"
resolved "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz"
integrity sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==
function.prototype.name@^1.1.6:
version "1.1.6"
resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz"
@ -2332,11 +2249,6 @@ get-stream@^6.0.0, get-stream@^6.0.1:
resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz"
integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
get-stream@^8.0.1:
version "8.0.1"
resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz"
integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==
get-symbol-description@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz"
@ -2572,11 +2484,6 @@ human-signals@^4.3.0:
resolved "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz"
integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==
human-signals@^5.0.0:
version "5.0.0"
resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz"
integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==
humanize-ms@^1.2.1:
version "1.2.1"
resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz"
@ -2896,11 +2803,6 @@ is-unicode-supported@^0.1.0:
resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz"
integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
is-unix@~2.0.10:
version "2.0.10"
resolved "https://registry.npmjs.org/is-unix/-/is-unix-2.0.10.tgz"
integrity sha512-CcasZSEOQUoE7JHy56se4wyRhdJfjohuMWYmceSTaDY4naKyd1fpLiY8rJsIT6AKfVstQAhHJOfPx7jcUxK61Q==
is-weakref@^1.0.2:
version "1.0.2"
resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz"
@ -3137,6 +3039,14 @@ lru-queue@^0.1.0:
dependencies:
es5-ext "~0.10.2"
m3u8stream@^0.8.6:
version "0.8.6"
resolved "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz"
integrity sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==
dependencies:
miniget "^4.2.2"
sax "^1.2.4"
mailtrap@^3.3.0:
version "3.3.0"
resolved "https://registry.npmjs.org/mailtrap/-/mailtrap-3.3.0.tgz"
@ -3144,7 +3054,7 @@ mailtrap@^3.3.0:
dependencies:
axios ">=0.27"
memoizee@^0.4.15, memoizee@0.4:
memoizee@^0.4.15:
version "0.4.15"
resolved "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz"
integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==
@ -3223,6 +3133,11 @@ min-indent@^1.0.0:
resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz"
integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
miniget@^4.2.2:
version "4.2.3"
resolved "https://registry.npmjs.org/miniget/-/miniget-4.2.3.tgz"
integrity sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==
minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
@ -3312,9 +3227,9 @@ npm-run-path@^4.0.1:
path-key "^3.0.0"
npm-run-path@^5.1.0:
version "5.3.0"
resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz"
integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==
version "5.1.0"
resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz"
integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==
dependencies:
path-key "^4.0.0"
@ -3507,11 +3422,6 @@ parse-json@^5.0.0, parse-json@^5.2.0:
json-parse-even-better-errors "^2.3.0"
lines-and-columns "^1.1.6"
parse-ms@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz"
integrity sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==
path-exists@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
@ -3760,13 +3670,6 @@ prettier@^3.0.0, prettier@^3.1.1, prettier@>=3.0.0:
resolved "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz"
integrity sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==
pretty-ms@~7.0.1:
version "7.0.1"
resolved "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz"
integrity sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==
dependencies:
parse-ms "^2.1.0"
process-warning@^2.0.0:
version "2.2.0"
resolved "https://registry.npmjs.org/process-warning/-/process-warning-2.2.0.tgz"
@ -4018,6 +3921,11 @@ safe-stable-stringify@^2.3.1:
resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz"
integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==
sax@^1.1.3, sax@^1.2.4:
version "1.4.1"
resolved "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz"
integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==
schema-utils@^3.1.1, schema-utils@^3.2.0:
version "3.3.0"
resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz"
@ -4032,18 +3940,6 @@ secure-json-parse@^2.4.0, secure-json-parse@^2.7.0:
resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz"
integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==
semver-regex@^4.0.5:
version "4.0.5"
resolved "https://registry.npmjs.org/semver-regex/-/semver-regex-4.0.5.tgz"
integrity sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==
semver-truncate@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/semver-truncate/-/semver-truncate-3.0.0.tgz"
integrity sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==
dependencies:
semver "^7.3.5"
semver@^5.7.2:
version "5.7.2"
resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz"
@ -4054,7 +3950,7 @@ semver@^6.3.0:
resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.0.0, semver@^7.3.5, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0:
semver@^7.0.0, semver@^7.5.3, semver@^7.5.4:
version "7.6.2"
resolved "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz"
integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
@ -4143,11 +4039,6 @@ signal-exit@^3.0.3, signal-exit@^3.0.7:
resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz"
integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
signal-exit@^4.1.0:
version "4.1.0"
resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz"
integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
simple-concat@^1.0.0:
version "1.0.1"
resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz"
@ -4321,14 +4212,6 @@ stripe@^15.7.0:
"@types/node" ">=8.1.0"
qs "^6.11.0"
super-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.npmjs.org/super-regex/-/super-regex-1.0.0.tgz"
integrity sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==
dependencies:
function-timeout "^1.0.1"
time-span "^5.1.0"
supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
@ -4414,13 +4297,6 @@ thread-stream@^2.0.0:
dependencies:
real-require "^0.2.0"
time-span@^5.1.0:
version "5.1.0"
resolved "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz"
integrity sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==
dependencies:
convert-hrtime "^5.0.0"
timers-ext@^0.1.7:
version "0.1.7"
resolved "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz"
@ -4429,11 +4305,6 @@ timers-ext@^0.1.7:
es5-ext "~0.10.46"
next-tick "1"
tinyspawn@~1.2.9:
version "1.2.13"
resolved "https://registry.npmjs.org/tinyspawn/-/tinyspawn-1.2.13.tgz"
integrity sha512-XZG5oVXMvbGzxggFzLebCAoXBqRsA2Ew/UsZUguOGhC2699uID6GTA5tcuW2GH3s/i/thFYDuPRyaG3A46LwgA==
titleize@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz"
@ -4823,16 +4694,14 @@ yocto-queue@^1.0.0:
resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz"
integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==
youtube-dl-exec@^3.0.2:
version "3.0.2"
resolved "https://registry.npmjs.org/youtube-dl-exec/-/youtube-dl-exec-3.0.2.tgz"
integrity sha512-kSNss5pkiZ7nXqh13m8pw1Os5s4t81RkpsZ7YozaJYVUDFrSXWKtvzhfaJ8dJH7QiK5qbeiuWs2z86lLuzMkRA==
ytdl-core@^4.11.5:
version "4.11.5"
resolved "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.11.5.tgz"
integrity sha512-27LwsW4n4nyNviRCO1hmr8Wr5J1wLLMawHCQvH8Fk0hiRqrxuIu028WzbJetiYH28K8XDbeinYW4/wcHQD1EXA==
dependencies:
bin-version-check "~6.0.0"
dargs "~7.0.0"
debug-logfmt "~1.2.2"
is-unix "~2.0.10"
tinyspawn "~1.2.9"
m3u8stream "^0.8.6"
miniget "^4.2.2"
sax "^1.1.3"
zod@^3.22.4:
version "3.22.4"