├── .gitignore ├── LICENSE ├── Readme.md ├── index.js ├── package.json ├── qa.json ├── transcriptions.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.mp3 3 | 4 | .env 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Georgios Giannoutsos Barkas 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # YouTube Transcription and Q&A with GPT-4 2 | 3 | This is a fun and easy-to-use module that downloads and transcribes YouTube videos, and then uses OpenAI's GPT-4 model to answer questions about the video content. It's perfect for when you want to get a quick summary or answer specific questions about a video without watching the whole thing. 4 | 5 | image 6 | 7 | **Note**: This project uses the GPT-4 model, which requires access to that model through the OpenAI API. Make sure your OpenAI account has access to GPT-4 before using this project. 8 | 9 | **Created with the help of GPT-4**: The code and this README were generated also with the assistance of OpenAI's GPT-4 model. 10 | 11 | ## Features 12 | 13 | - Downloads YouTube videos and converts them to MP3 14 | - Splits large audio files into smaller chunks for transcription 15 | - Transcribes audio using OpenAI's Whisper ASR API 16 | - Stores transcriptions in a JSON file for future use 17 | - Asks GPT-4 questions about the video content and gets answers 18 | - Stores questions and answers in a separate JSON file 19 | 20 | ## Getting Started 21 | 22 | To get started, you'll need to have Node.js installed on your computer. You can download it from the [official Node.js website](https://nodejs.org/). 23 | 24 | You'll also need to set up an OpenAI API key. You can get one by signing up for an account at [OpenAI](https://beta.openai.com/signup/). 25 | 26 | To use the script without installing it locally, you can run the following command, replacing the YouTube URL and question with your desired values: 27 | 28 | ```bash 29 | npx youtube-gpt 'https://www.youtube.com/watch?v=ylpAHvPlafc' 30 | ``` 31 | 32 | Please make sure that you provide your OpenAI API key as a variable: 33 | 34 | ```bash 35 | export OPENAI_API_KEY=your-openai-api-key-here 36 | ``` 37 | 38 | The script will download the YouTube video, transcribe it, and ask GPT-4 your question. The transcription, question, and GPT-4's answer will be saved in JSON files for future reference. 39 | 40 | After the YouTube URL, you can provide your own question. Otherwise it will use the default one, for summarizing the video. 41 | 42 | ## Local development 43 | 44 | Clone this repository and navigate to the project folder: 45 | 46 | ```bash 47 | git clone https://github.com/nuc/youtube-gpt.git 48 | cd youtube-transcription-gpt4 49 | ``` 50 | 51 | Install the required dependencies: 52 | 53 | ```bash 54 | yarn install 55 | ``` 56 | 57 | Create a new file called `.env` in the project folder and add the following line, replacing `your-openai-api-key-here` with your API key: 58 | 59 | ``` 60 | OPENAI_API_KEY=your-openai-api-key-here 61 | ``` 62 | 63 | ## Known Issues 64 | 65 | GPT-4 has a maximum token limit of 8,000 tokens. In long videos (30 minutes or more), the tokens along with the generated response might exceed this limit. A future improvement would be to use a document or vector database like Pinecone to gather only matching documents before constructing the prompt. However, this approach might not work as well for summarization. If you have any ideas on how to solve this issue, feel free to get in touch. 66 | 67 | ## Contributing 68 | 69 | Feel free to fork this repository and make any changes or improvements you'd like. If you think your changes would be helpful to others, please submit a pull request. We'd love to see what you come up with! 70 | 71 | ## License 72 | 73 | This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details. 74 | 75 | ## Have Fun! 76 | 77 | We hope you enjoy using this project as much as we enjoyed creating it. If you have any questions or run into any issues, please don't hesitate to reach out. Happy transcribing and questioning! 78 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | require('dotenv').config() 3 | 4 | const ytdl = require('ytdl-core'); 5 | const ffmpeg = require('fluent-ffmpeg'); 6 | const axios = require('axios'); 7 | const FormData = require('form-data'); 8 | const fs = require('fs'); 9 | const { Readable } = require('stream'); 10 | const { encode, decode } = require('gpt-3-encoder'); 11 | const path = require('path'); 12 | const wordWrap = require('word-wrap'); 13 | 14 | const YOUTUBE_URL = process.argv[2]; 15 | const QUESTION = process.argv[3] || 'Please summarize the video'; 16 | const OPENAI_API_KEY = process.env.OPENAI_API_KEY; 17 | const MAX_FILE_SIZE = 20 * 1024 * 1024; // 20MB 18 | const JSON_FILE = 'transcriptions.json'; 19 | const QA_FILE = 'qa.json'; 20 | const MAX_TOKENS = 1000; 21 | const TMP_DOWNLOADS = './tmp_downloads'; 22 | 23 | const logger = (message) => process.env.DEBUG_LOGS && console.log(message) 24 | 25 | const CHUNK_SUMMARIZATION = false; 26 | 27 | if (!YOUTUBE_URL) { 28 | console.error('Please provide a YouTube URL as a command-line argument.'); 29 | process.exit(1); 30 | } 31 | 32 | if (!OPENAI_API_KEY) { 33 | console.error('Please provide an OpenAI API key as an env var `OPENAI_API_KEY` (or in the .env file if you have cloned the repo).'); 34 | process.exit(1); 35 | } 36 | 37 | const videoId = new URL(YOUTUBE_URL).searchParams.get('v'); 38 | let videoTitle 39 | 40 | async function download(url) { 41 | try { 42 | // Download and convert YouTube video to MP3 43 | if (!fs.existsSync(TMP_DOWNLOADS)) { 44 | fs.mkdirSync(TMP_DOWNLOADS); 45 | } 46 | // Get basic info of the video including title 47 | const videoInfo = await ytdl.getBasicInfo(url); 48 | videoTitle = videoInfo.videoDetails.title; 49 | 50 | const audioPath = path.join(TMP_DOWNLOADS, `${videoId}.mp3`); 51 | if (fs.existsSync(audioPath)) { 52 | logger('Audio already exists, skipping download'); 53 | return audioPath; 54 | } 55 | logger('Downloading YouTube video...'); 56 | 57 | await new Promise((resolve, reject) => { 58 | const videoStream = ytdl(url, { quality: 'lowestaudio', filter: 'audioonly' }); 59 | const converter = ffmpeg(videoStream) 60 | .format('mp3') 61 | .on('error', reject) 62 | .on('end', resolve) 63 | .save(audioPath); 64 | }); 65 | logger('YouTube video downloaded and converted to MP3.'); 66 | return audioPath 67 | } catch (error) { 68 | console.error(error); 69 | } 70 | } 71 | 72 | async function splitAudioFile(inputFile, maxChunkSize, outputDir) { 73 | try { 74 | const { size } = fs.statSync(inputFile); 75 | const maxChunkSizeBytes = maxChunkSize; 76 | 77 | const metadata = await new Promise((resolve, reject) => { 78 | ffmpeg.ffprobe(inputFile, (err, metadata) => { 79 | if (err) reject(err); 80 | resolve(metadata); 81 | }); 82 | }); 83 | 84 | const duration = metadata.format.duration; 85 | const bitrate = metadata.format.bit_rate / 8; // Convert to bytes per second 86 | const chunkDuration = Math.floor((maxChunkSizeBytes / bitrate) * 1000) / 1000; // Duration in seconds 87 | 88 | const totalChunks = Math.ceil(duration / chunkDuration); 89 | // logger(`File size: ${size} bytes, Max chunk size: ${maxChunkSizeBytes} bytes, Total chunks: ${totalChunks}`); 90 | 91 | const outputFiles = []; 92 | let currentChunk = 1; 93 | 94 | while (currentChunk <= totalChunks) { 95 | const outputFile = `${outputDir}/output_${currentChunk}.mp3`; 96 | outputFiles.push(outputFile); 97 | 98 | await new Promise((resolve, reject) => { 99 | const startTime = (currentChunk - 1) * chunkDuration; 100 | 101 | ffmpeg(inputFile) 102 | .seekInput(startTime) 103 | .duration(chunkDuration) 104 | .output(outputFile) 105 | .on('end', resolve) 106 | .on('error', reject) 107 | .run(); 108 | }); 109 | 110 | currentChunk++; 111 | } 112 | 113 | return outputFiles; 114 | } catch (error) { 115 | console.error(error); 116 | } 117 | } 118 | 119 | // Function to split a file and upload the chunks to the OpenAI API for transcription 120 | async function splitAndUpload(inputFile, maxChunkSize) { 121 | try { 122 | const files = await splitAudioFile(inputFile, maxChunkSize, '.'); 123 | 124 | // logger(files); 125 | 126 | let transcriptions = []; 127 | for (let i = 0; i < files.length; i++) { 128 | logger(`Uploading chunk ${i + 1} of ${files.length} to OpenAI...`); 129 | const fileBuffer = fs.readFileSync(files[i]); 130 | const transcript = await uploadFileAndTranscribe(fileBuffer); 131 | transcriptions.push(transcript); 132 | 133 | // Remove the temporary file after uploading 134 | fs.unlinkSync(files[i]); 135 | } 136 | 137 | logger('All chunks uploaded to OpenAI.'); 138 | return transcriptions.join(' '); 139 | } catch (error) { 140 | console.error(error); 141 | } 142 | } 143 | 144 | // Function to upload a file to the OpenAI API and return the transcription 145 | async function uploadFileAndTranscribe(fileBuffer) { 146 | try { 147 | const formData = new FormData(); 148 | formData.append('file', Buffer.from(fileBuffer), { filename: 'chunk.mp3' }); 149 | formData.append('model', 'whisper-1'); 150 | 151 | const response = await axios.post('https://api.openai.com/v1/audio/transcriptions', formData, { 152 | headers: { 153 | ...formData.getHeaders(), 154 | Authorization: `Bearer ${OPENAI_API_KEY}`, 155 | }, 156 | }); 157 | 158 | const transcript = response.data.text; 159 | // logger('Transcription:', transcript); 160 | return transcript; 161 | } catch (error) { 162 | console.error(error.response.data); 163 | } 164 | } 165 | 166 | async function saveTranscription(id, title, transcript, tokenCount, summarizedChunks) { 167 | logger('Saving transcription to file...'); 168 | let transcriptions = {}; 169 | 170 | if (fs.existsSync(JSON_FILE)) { 171 | const fileContent = fs.readFileSync(JSON_FILE, 'utf-8'); 172 | transcriptions = JSON.parse(fileContent); 173 | } 174 | 175 | transcriptions[id] = { title, transcript, tokenCount, summarizedChunks }; 176 | fs.writeFileSync(JSON_FILE, JSON.stringify(transcriptions, null, 2)); 177 | } 178 | 179 | async function getTranscription(id) { 180 | if (fs.existsSync(JSON_FILE)) { 181 | const fileContent = fs.readFileSync(JSON_FILE, 'utf-8'); 182 | const transcriptions = JSON.parse(fileContent); 183 | 184 | if (transcriptions[id]) { 185 | logger('Transcription found in file.'); 186 | return transcriptions[id]; 187 | } 188 | } 189 | 190 | return null; 191 | } 192 | 193 | async function askGPT4(transcript, question) { 194 | // logger(`Asking GPT-4: ${question} for transcript: ${transcript}`); 195 | try { 196 | const response = await axios.post( 197 | 'https://api.openai.com/v1/chat/completions', 198 | { 199 | model: 'gpt-4', 200 | temperature: 0.3, 201 | messages: [ 202 | { role: 'system', content: `Transcript: ${transcript}` }, 203 | { role: 'user', content: question }, 204 | ], 205 | }, 206 | { 207 | headers: { 208 | 'Content-Type': 'application/json', 209 | Authorization: `Bearer ${OPENAI_API_KEY}`, 210 | }, 211 | } 212 | ); 213 | 214 | const answer = response.data.choices[0].message.content.trim(); 215 | return answer; 216 | } catch (error) { 217 | console.error(error.response.data); 218 | } 219 | } 220 | 221 | async function saveQA(id, question, answer) { 222 | let qa = {}; 223 | 224 | if (fs.existsSync(QA_FILE)) { 225 | const fileContent = fs.readFileSync(QA_FILE, 'utf-8'); 226 | qa = JSON.parse(fileContent); 227 | } 228 | 229 | if (!qa[id]) { 230 | qa[id] = []; 231 | } 232 | 233 | qa[id].push({ question, answer }); 234 | fs.writeFileSync(QA_FILE, JSON.stringify(qa, null, 2)); 235 | } 236 | 237 | async function getQA(id) { 238 | if (fs.existsSync(QA_FILE)) { 239 | const fileContent = fs.readFileSync(QA_FILE, 'utf-8'); 240 | const qa = JSON.parse(fileContent); 241 | 242 | if (qa[id]) { 243 | return qa[id]; 244 | } 245 | } 246 | 247 | return []; 248 | } 249 | 250 | async function findExistingAnswer(id, question) { 251 | const existingQA = await getQA(id); 252 | 253 | const exists = existingQA.find((qa) => qa.question === question); 254 | if (exists) { 255 | return exists.answer; 256 | } 257 | return null; 258 | } 259 | 260 | async function splitTranscript(transcript, maxTokens) { 261 | const tokens = encode(transcript); 262 | const chunks = []; 263 | 264 | for (let i = 0; i < tokens.length;) { 265 | let end = i + maxTokens; 266 | while (end < tokens.length && tokens[end] !== encode('. ')[0]) { 267 | end--; 268 | } 269 | if (end >= tokens.length) { 270 | end = tokens.length - 1; 271 | } else { 272 | end++; // To include the full stop in the chunk 273 | } 274 | 275 | const chunkTokens = tokens.slice(i, end); 276 | const chunkText = decode(chunkTokens); 277 | chunks.push(chunkText); 278 | i = end; 279 | } 280 | 281 | return chunks; 282 | } 283 | 284 | const logResponse = ({ title, QUESTION, answer }) => { 285 | const response = `--------------------------- 286 | VIDEO: ${title} 287 | --------------------------- 288 | QUESTION: ${QUESTION} 289 | --------------------------- 290 | ANSWER: ${answer} 291 | `; 292 | const wrappedResponse = wordWrap(response, { width: 80, indent: ' ' }); 293 | console.log(wrappedResponse); 294 | } 295 | 296 | const run = async () => { 297 | console.log(` --------------------------- `) 298 | console.log(' Generating answers...'); 299 | let transcriptData = await getTranscription(videoId); 300 | 301 | if (!transcriptData) { 302 | const audioFile = await download(YOUTUBE_URL); 303 | const fullTranscript = await splitAndUpload(audioFile, MAX_FILE_SIZE); 304 | const tokenCount = encode(fullTranscript).length; 305 | 306 | if (tokenCount > 5000) { 307 | logger(`Transcript contains ${tokenCount} tokens. The output might be truncated.`); 308 | } 309 | 310 | let summarizedChunks = []; 311 | if (CHUNK_SUMMARIZATION && tokenCount > MAX_TOKENS) { 312 | const chunks = await splitTranscript(fullTranscript, MAX_TOKENS); 313 | 314 | for (const chunk of chunks) { 315 | const summary = await askGPT4(chunk, 'Please summarize this text'); 316 | summarizedChunks.push(summary); 317 | } 318 | } 319 | 320 | transcriptData = { title: videoTitle, transcript: fullTranscript, tokenCount, summarizedChunks }; 321 | saveTranscription(videoId, videoTitle, fullTranscript, tokenCount, summarizedChunks); 322 | } 323 | 324 | const { title, transcript, tokenCount, summarizedChunks } = transcriptData; 325 | 326 | let answer = await findExistingAnswer(videoId, QUESTION); 327 | 328 | if (!answer) { 329 | if (summarizedChunks && summarizedChunks.length > 0) { 330 | const summarizedTranscript = summarizedChunks.join(' '); 331 | answer = await askGPT4(summarizedTranscript, QUESTION); 332 | } else { 333 | answer = await askGPT4(transcript, QUESTION); 334 | } 335 | 336 | logger('GPT-4 Response:', answer); 337 | saveQA(videoId, QUESTION, answer); 338 | } else { 339 | logger('Existing Answer:', answer); 340 | } 341 | logResponse({ title, YOUTUBE_URL, QUESTION, answer }); 342 | }; 343 | 344 | run(); 345 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "youtube-gpt", 3 | "main": "index.js", 4 | "dependencies": { 5 | "axios": "^1.3.4", 6 | "dotenv": "^16.0.3", 7 | "fluent-ffmpeg": "^2.1.2", 8 | "form-data": "^4.0.0", 9 | "gpt-3-encoder": "^1.1.4", 10 | "word-wrap": "^1.2.3", 11 | "ytdl-core": "^4.11.3" 12 | }, 13 | "bin": { 14 | "youtube-gpt": "./index.js" 15 | }, 16 | "version": "0.0.4" 17 | } 18 | -------------------------------------------------------------------------------- /qa.json: -------------------------------------------------------------------------------- 1 | { 2 | "-s_ABD7vvM4": [ 3 | { 4 | "question": "Please summarize the video", 5 | "answer": "The video features a 3-year-old Russian chess prodigy, Mikhail Osipov, who played against former World Chess Champion Anatoly Karpov on a television show. Despite making some mistakes, Osipov showcased impressive skills for his age. Karpov praised the young player's understanding and maturity. Osipov later returned to the show and successfully solved several complex chess puzzles, further demonstrating his exceptional talent." 6 | } 7 | ], 8 | "HhSCMGdq11Y": [ 9 | { 10 | "question": "Are there many bugs?", 11 | "answer": "Yes, The Last of Us on PC has been reported to have many bugs and performance issues. Some of these issues include stuttering, inconsistent frame rates, crashes, long load times, and graphical glitches. The game's performance has been widely criticized in Steam reviews and by various players. While some players have managed to run the game with fewer issues, it seems that the majority have encountered problems, making it a less than ideal experience for many." 12 | }, 13 | { 14 | "question": "Please summarize the video", 15 | "answer": "The video is a first impressions review of The Last of Us Part 1 on PC. The reviewer, Jake, expresses disappointment with the game's performance issues on PC, despite it being a beloved and highly anticipated title. Many players have reported problems such as stuttering, crashes, and long load times, even on high-end systems. The game also has some strange default settings and issues with compiling shaders.\n\nJake mentions that the PC version could have been the definitive version of the game, with its in-depth display and graphical options. However, the poor optimization and widespread issues make it hard to recommend at this time. He advises potential buyers to wait for patches and updates before purchasing the game, and to research other reviews and experiences before making a decision.\n\nDespite the issues, Jake still praises the game itself, highlighting its memorable moments, characters, and gameplay. He hopes that the PC community will eventually be able to enjoy and mod the game once the performance issues are resolved." 16 | } 17 | ], 18 | "8ODz7Kx8_aQ": [ 19 | { 20 | "question": "Explain it like I am five.", 21 | "answer": "GPT is like a smart robot friend that can talk and write. It learns by reading lots of things people say and write. It helps us by answering questions, writing stories, and giving ideas. It's not perfect, but it's getting better, and one day it might be really important, just like computers are important now." 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /transcriptions.json: -------------------------------------------------------------------------------- 1 | { 2 | "-s_ABD7vvM4": { 3 | "transcript": "Ladies and gentlemen, did you know that according to my YouTube analytics, 75% of you are between the ages of 18 and 35? No, of course you didn't know that, because if you had access to my YouTube dashboard it would be weird. That means that most of you got into chess or got back into chess at that age. Maybe you played it when you were very young. But did you know there are kids out there who are 3 years old and they are really good at chess? 3! I learned how to move the pieces when I was nearly 6. And in today's video, I'm going to be telling you the story of Mikhail Osipov, a Russian 3 year old chess prodigy who first came to fame like in an explosion because he was on a Russian TV show where they spotlight these types of talents. And in today's video, I'm going to show you clips from the TV show. I'm going to show you the game that he played against world champion Anatoly Karpov. And at the end, we will also look at this little 3 year old dude solving ridiculously hard chess puzzles. And then you can show this to your kids and go, you see how much time you spent on the iPad? You could be Mikhail Osipov. And by the way, there's a second part to all of this, which is the fact that he came back to the show a little while later when he was 4 years old. So I was going to show you the clip, but as it happens, even though it's in Russian, it's fully copyrighted. So instead of showing you the clip, I'm just going to hope that I can click through the clip without actually playing it and setting off copyrights. This is a show called Lutche Vsekh. This is Mikhail Osipov. He is a tiny, tiny human. He is 3 years old. And on this show, they clearly invite guests who are extremely talented at their field of work. And he is so small, he can barely get down a flight of stairs. The show host offers to give him a hand coming down the steps. By the way, if you guys want to watch this video, it's great. It's got English subtitles in case you can't understand. And they sit down and they start having a chat. And he's tiny. His feet, two sets of his legs could not touch the floor. And they talk and he asks him, you know, do you know how the knight moves, which is ironic because Andrea Botes asked that to Magnus Carlsen at the World Chess Championship last time. And then, you know, they talk a little bit and he says he's 3 years old and he likes to play chess. And he asked him a few questions and then they bring out a chess set. That's not his mom, but his mom is in the audience. And they sit down and they're going to play a game with this kind of analog style clock. But here the show host admits that he doesn't know how to play chess and they have a surprise guest and this is like a very famous meme. It's called Chess Final Boss. And basically, the show host invites the 12th World Champion, Anatoly Garpov, you know, sportsman of Russia winning some medal, you know, the Medal of Honor, like, you know, some countries they have like this sports medal. And they bring out Anatoly Garpov. And then this kid's like, what the f- He either was not told or he forgot. And he's looking around. This is like an extremely hilarious meme. And you know, Anatoly Garpov does a little walk out in the tunnel. This is a- I can't play it because they'll copyright it. Hopefully they don't copyright the still images. And then, you know, here Misha says, we studied your chess textbook against Viktor Korchnoi. And he can barely speak. I mean, he can barely say any words. It's adorable. It's completely hilarious. It's so cute. And Garpov like asked him a few questions. And Misha takes the white pieces and they sit down and they play 10 minutes for Misha and two minutes for Garpov. So 10 to 2. Not very fair, but you know, one of them is three and the other one's a world- former World Champion. And you become a World Champion for life. It's kind of like being president. You know, they call you President X. Well, you know, World Champion Anatoly Garpov. And now I'm going to show you the game and then I'm going to show you a little bit of the epilogue. All right. It was it was incredible. I mean, here's like a still image of them just actively playing, you know, just unbelievable stuff. Anyway, I would have shown you the clip, but they copyrighted it. So instead, I will show you this. Enjoy the game and I will show you the exceptional puzzle solving skills a little bit later. This video is a few years old, obviously. It was filmed in like 20. I don't know. My perception of time completely got warped after COVID. I don't know how long ago it was or what year. But he's not the only one. And so what I want to do on this channel is I want to spotlight individual talents like this. So Osipov started the game with the Queen's Pawn. Like. OK, Knight f6 from Garpov. c4 e6. This little man is just straight up playing real openings like he's playing the main line Queen's Pawn. He's not even playing a London. He's not even playing like a neutered chess opening like the London. Just kidding. London is great. He's playing principled chess openings. Now Anatoly starts with Knight f6 e6 rather than putting a pawn in the center. It's actually considered very mildly inaccurate to play this move order of the Queen's Gambit declined. If Knight c3 happens, the reason Black played like this is to fight back against the move e4 with the move Bishop before pinning the Knight to the King. If you know your chess openings, you know this is called the Nimso Indian. If you don't know your chess openings, now you know this is called the Nimso Indian defense. And it's one of the most classical openings in chess. It was something that Karpov played his entire career in the mid 20th century and late 20th century. And here there are a multitude of different lines. There's kind of like the ignore line, which is e3 and finish your development like this or Knight f3. There's other lines though. One of the lines now, I don't necessarily think Mikhail Osipov knows that he's playing main line theory. I think he just saw a Bishop and decided to attack it. But it just like, you know, it so happens in chess. Sometimes you play a random move in the opening and it turns out to be a line. This is called the Samish variation. And basically White just says, I don't like your Bishop there, take my Knight. And Black says, no problem, I'm going to take your Knight. Now, why would Black give away a Bishop so early? Well, Black is blocking White's natural development and damaging the structure. So it's going to be a little hard to get this Bishop out, obviously on that side. And you're most likely going to have to play e3, so this Bishop will get stuck. If you play Bishop f4, Black will try to very quickly put some pressure on those doubled pawns. So it's good and bad. All right. So Black has some problems in the position. And Karpov plays c5, which is one of the main lines. Now, White here has an approach to very solidly build up the center. Or this is actually a line that I like to play very much. f3 is kind of like the main line Samish. And the idea is to play e4 just very, very quickly. And in a perfect situation, White gets something that looks kind of like this. And this is really nice. White can then play Bishop, Knight, Castle. And White enjoys a massive advantage of space. But as you can see, according to the eval bar, it's still equal because such is chess. Now c5 proved to be a little bit too enticing for the young man. And he took the pawn. Now taking on c5, believe it or not, I mean as cruel as chess is, is already a borderline losing mistake. Not at his level and not at your level necessarily. But at Anatoly Karpov's level, this is a fatal error. It's crazy that taking a free pawn and being up one pawn on move 6 at the highest level of the game is fatal. Why is this fatal? You shouldn't have tripled pawns. You especially should not have tripled isolated pawns. No d neighbors, no b neighbors. Everybody needs some d. And so tripled pawns, completely, completely weak for the remainder of the game. Black will play Knight a6, Knight c5. Black will play Queen a5, Black will play knight e4. Black is going to get one of the pawns back. And then White is still left with all the difficulties of having the bad structure. But Mikhail Osipov is three years old. He just saw a free pawn and he took it. Can you blame him? Alright, so Knight a6. And in this position, Misha realized, well, I'm not going to be, I probably shouldn't hang on to my pawn, even though moves like Queen d4, moves like Bishop e3 are all enticing. It could do more harm than good because as you can see, the e-val drops even more if you try to defend your pawn, right? So instead he plays Bishop g5. Now Bishop g5 is not the most accurate move, but he's developing a Bishop, alright? He's not trying to be greedy. He's developing a Bishop. He's pinning the Knight to the Queen and life is good. Now here, Karpov just kind of playing the principled move, which is taking the pawn back and now Karpov will be castling. Now he will probably put his Knight on e4. Like I said, Black has regained the pawn and he still has the benefits of the position. What does Black not have? Certain dark square assets, right? This Bishop could try to get in. Osipov develops his Knight. I mean he's just developing his pieces like normal. Okay, he's slightly worse. He's playing Anatoly Karpov, arguably one of the greatest positional chess players to ever live. b6, Karpov delaying castling in order to finish his development and play in typical Nimso style. In the Nimso Indian, all the way back to this move c5, Black wants to apply pressure to these pawns by virtue of Knight a5 as well as Bishop a6. And in this game, we're not going to get Knight a5. We have Knight on c5, but Karpov wants to apply some c-file pressure to those pawns. And you kind of see White got the Bishop pair early, but because White captured on c5, White has certain drawbacks, right? So we have b6 and now we have g3. I mean he's going here. Now Karpov, a machine, all right? You understand Karpov was developing his Queen side, was going to go b6, Bishop a6. But the second that little Osipov played g3, trying to develop his Bishop to g2, Anatoly did not play Bishop a6, trying to win this pawn. Anatoly played h6. Why did he play h6 now? Because if he had played h6 in this position, the Bishop would have gone here and g5, the Bishop can just escape and there's nothing. The second the youngster played this to finish up his development, now Anatoly went here because now he ain't got this. He ain't pinning nothing because I'm trapping your Bishop. One subtle pawn move and world champion plays h6. Now Misha's young, he sees his Bishop is hanging, he probably saw Bishop h4, g5, so he said I'm going to take. But now remember, White's entire advantage of this position, the only thing that White could cling on to was the Bishop pair, he no longer has it. However the position is still materially equal. For a kid this age, this is ridiculous. Now he just plays knight d4. Why did he play knight d4, not Bishop g2? He saw this was hanging. And that's really tough to protect, you could play rook c1, but then your rook is kind of passive queen d2, there's a fork. He probably thought knight d4, I'm going to go here and I'm going to attack his rook. Unfortunately Mr. Karpov was a little bit faster here, but Misha played the best move, f3, not afraid of weakening his position, he's going to go here, here, and castle. Karpov castles, Osipov plays bishop to g2, finishing up his development, and now that Anatoly has sort of finished the opening stage, it's time to start taking over the position, utilizing the advantages that he got from the opening stage, and he plays bishop a6. So this pawn is going to be very tough to defend. If you play knight b5, you stop the attack on this, but I got news for you. Unfortunately you exacerbate matters, and now it's going to get real bad. And here Osipov plays one of the best, he plays f4. He plays pawn to f4, counterattacking the rook, he's three, damn it! Do you know how few of you would see f4? Like I don't know, 200,000 of you? This dude is three years old. It was a matter of weeks ago, he might have not been able to use the potty on his own. He might still not, I don't know when kids get potty trained. I don't have one, I have a dog. He's barely potty trained, alright? He's potty trained, I don't know why I'm throwing him under the bus, he's great, he's wonderful. He was awful the first six months, but now he's wonderful. I'm sorry Benji, you're great. Can you get me a pet food sponsorship? Yo pet food companies, hit me up. Don't spend money on those Super Bowl ads, they're like 30 million, I'll do it for half. Rook c8, castles, bishop c4. Now here there is a funny moment. Folks, remember how I told you that it was 10 minutes versus 2? Well here it's about a minute each. Kishiro was playing a little slowly, because he's 3. So Karpov here says, well you know, you and I are even on time, and even in the position. Do you want to draw? And Oshipov looks at him and goes, нет. Not understanding that he's probably going to lose on time. Well unfortunately, he strikes at the world champ, the world champ doesn't allow any activity here, doesn't allow any of this stuff. He closes down the position, and in just a couple of moves, he secures a clamp on the center, everything is defended, pressure on the position, and here, unfortunately, Mishra Oshipov lost on time. Now it was sad, it was definitely a little bit sad to see. He was very teary eyed, he cried a little bit, he was very overwhelmed by the moment, and by the way that's a separate discussion bringing a 3 year old on a television program, but he was very overwhelmed, and he ran to his mom, his mom comforted him, but then, I mean, Anatoly was so, so complimenting, he was saying, I've never played somebody this young, his understanding is that of a mature sportsman, it was beautiful, incredible, I highly encourage you to watch it, especially because it's subtitled. Then they brought him back, they gave him a medal, and it was amazing, it was, well I'll show you. So here's how they played, Mishra was a bit upset, he was a bit overwhelmed by the moment, with the crowd and everything, and he got a bit teary eyed and he ran to his mom, it was a very, very sweet moment, and reminding us that he is literally 3 years old, which is just so mind blowing. And then what they did is they awarded him a medal, and they invited him to solve puzzles on the monitor, so it's tiny Mishra, Anatoly Karpov and the show host, and Mishra is just solving tactics on a big screen. He's solving tactics, I mean look at this, this is crazy, he's solving checkmates in three, which I will show you, I'm gonna show them to you separately. And at some point the host, he solves another one, and Mishra I have no words, at some point the host asks Anatoly, is this impressive for a 3 year old? And Anatoly's like unbelievably impressive, like so impressive. He is solving some absurd chess studies, like impossible positions that can arise when they are made, like somebody creates the position because the solution is so beautiful and sophisticated, and this 3 year old boy is solving them. I mean it's just unbelievable stuff. So I just wanted to show you this, I would have showed you the clip, but I can't or else they'll not allow me to monetize the video or even upload it. So enjoy the footage of him solving these positions. This little man solved this position, it's made in three. I mean you try to solve it. Pause here if you want, pause the video, try to solve this checkmate in three. This 3 year old solved checkmate in three. Three! He said knight h6, because queen g7 is knight takes, here that's not mate, you hunt the king out, and now the king is cut off geometrically, knight f5 prevents. But how, okay he's good, but can he solve a study? This is a study, this is not a real practical position, it's white to move, do something super creative and win the game. Knight g5, okay, rook g5, this dude said this answer before it even appeared on the screen, rook f6, rook d6 mate, a king and a rook mate in reverse in the middle of a, I mean come on this is ridiculous. And so the producer asked Karpov, he's like is it actually quite difficult to solve this when you're three? It's quite difficult to solve this if you're 45! And the last one I mean was absurd, so it's white to move, checkmate in three. You actually try to solve this, white to move, checkmate in three. First of all, this position is not legal, because there's no way it can be white to move, unless the king was just on that square or something, because that's, you know, and white gave a check and black didn't take the knight. This is so sick this one, and he solved it. Bishop f6, and now the pawn has to take the bishop. The pawn didn't have a legal move, now there's this king f8, it's stalemate, but the pawn moves. Get out of here, I mean this is just. Now because this was a few years ago, so Mishra was like, I don't know, nine or ten now, hopefully he's still playing. What sometimes happens is when a kid, when anybody has so much hype behind them, they very very, they don't live up to it sometimes. You know, LeBron James is probably the greatest example of somebody who has avoided trouble and lived up to the hype, right? Like in terms of, it's what a lot of people say. I can't speak about football, I don't know about, you know, football prospects, but it's just incredible. So I really hope he turns into quite a good player, and these kind of early media runs don't totally take away from his confidence or make him starstruck. I've known kids, like I used to teach at schools, if anybody's still here watching, I used to teach, before I was a YouTuber I taught at schools, I ran my own chess program, and the scariest thing for me was rushing a young kid into big things. I taught a few four and five year olds that were exceptional students, they were great, they loved chess, natural curiosity, it was amazing watching their brain connect neurons and fire them and learn new things. But the second they went to competition, that was it, they couldn't handle it. The stress, the pressure, all this stuff. So I wish him all the best, and I want to cover some more young prodigies on this channel because learning chess and being this good at it at three is an unbelievable feat of the human mind. Really, I mean, exceptional stuff. I'm glad I could share Mikhail Osipov with all of you, and I wish you all have a great rest of your day, or evening. Get out of here.", 4 | "tokenCount": 4504, 5 | "summarizedChunks": [ 6 | "This text is about a 3-year-old Russian chess prodigy named Mikhail Osipov who gained fame after appearing on a Russian TV show called Lutche Vsekh. The show features talented individuals, and in this case, the young chess player was invited. The host of the show brings out a chess set and then introduces a surprise guest, the 12th World Chess Champion, Anatoly Karpov. They play a game with a time control of 10 minutes for Mikhail and 2 minutes for Karpov. The text also mentions that Mikhail later returned to the show when he was 4 years old and solved difficult chess puzzles.", 7 | "This text is a commentary on a chess game between three-year-old prodigy Mikhail Osipov and former World Chess Champion Anatoly Karpov. Osipov starts with the Queen's Pawn opening, playing principled chess openings. Karpov responds with the Nimzo-Indian defense, leading to the Samish variation. Osipov makes a mistake by capturing a pawn on c5, resulting in tripled isolated pawns, which is considered a fatal error at the highest level of the game. Despite this, the text acknowledges that Osipov is only three years old and simply saw a free pawn and took it. The commentary highlights the impressive skills of young Osipov and aims to spotlight individual talents like his on the channel.", 8 | "The text describes a chess game between three-year-old Misha Osipov and world champion Anatoly Karpov. Misha demonstrates impressive skills for his age, making strong moves and not being afraid of weakening his position. Karpov, on the other hand, plays with his usual precision and takes advantage of small mistakes made by Misha. The author highlights Misha's exceptional talent and potential in chess, considering he is only three years old.", 9 | "The text describes a 3-year-old chess prodigy, Mishra Oshipov, who played against former World Chess Champion Anatoly Karpov on a television program. Despite losing on time, Karpov praised the young player's understanding and maturity. The show then awarded Mishra a medal and invited him to solve chess puzzles on a big screen. The 3-year-old successfully solved several complex checkmate and study puzzles, impressing both Karpov and the show host.", 10 | "The text discusses a young chess prodigy, Mikhail Osipov, who solved an exceptionally difficult chess problem at a young age. The author expresses hope that Osipov will continue to develop his skills and not be overwhelmed by the hype surrounding him. They also mention their experience teaching chess to young children and the challenges they faced when introducing them to competitive environments. The author wishes to cover more young prodigies on their channel, highlighting the incredible capabilities of the human mind." 11 | ] 12 | }, 13 | "HhSCMGdq11Y": { 14 | "transcript": "Hey, we're back with another episode of Before You Buy, that show where we give you some straight up gameplay and our first impressions of the latest games releasing. As usual, it's me Jake, and today we're talking about The Last of Us Part 1, finally released on PC. If you're a PlayStation gamer, this might not seem like a big deal to you. I mean, like, it's the remake we've seen recently on PS5, which is of course a remake of a game we've played remastered on PS4, and then of course there was the original PlayStation 3 version before that, but PC fans have been waiting a long time for this one, and after years and then some delays, it's finally here. So we bought it just yesterday and fired it up to give you some quick first impressions. Usually we get these types of quick look impressions out the night of the day it releases, but we're a day late because we ran into some problems. Yeah, by now you may have heard, The Last of Us on PC is a messy release. If you look at Steam's mostly negative reviews, it's all because of performance issues. There are the occasional PC players out there who have had little problems, you know. Some people have managed to have way better luck than us, but unfortunately we did not fall in that boat. For us right now, it seems like The Last of Us PC isn't really recommended. It needs significant kinks worked out, and if you jump in now without any patches or updates, it's a bit of a gamble whether or not it'll actually run well for you, especially if you're not like a technical wizard. In real time right now, it seems like the community is already working through their own homemade fixes, but like keep in mind, we are not tech whizzes. We can give our impressions as folks who play PC games, but in terms of using community tricks to try and fix it, we don't have any recommendations yet. And frankly, we paid $60, this should work. Usually in these videos, we always recommend and defer to Digital Foundry for their more technical take, but at the time of making this video, they don't have a video up yet. It doesn't seem like early reviews were really a thing for this one. But anyway, in our experience, we had a really hard time getting it stable while easily meeting the recommended specs. I mean, we had a 2080 Super, an up to par processor, and a damn good SSD, and we did not have a good time. Trying to get this game running at like 1440 and close to 60 as we could possibly get meant dropping most settings down to medium and some on low. And even that, no matter what little things we did and what we tried to tweak in settings and our PC here and there, it just didn't amount to anything really good. Plus, no matter what you do, it takes up seemingly an unreasonable amount of VRAM and it left our PC absolutely screaming constantly. I mean, the game looks all right, for sure, but we still had some stuttering and couldn't get a consistent frame rate. This was even with taking advantage of DLSS and messing with everything, we just couldn't get a smooth experience. I've seen others get better frame rates, some with higher specs, but often still not at great resolutions. And again, not the most consistent. And that lack of consistency here is just the most disappointing thing. And the inconsistency, like with the stuttering and the frame rate problems and stuff, like visually, yes, it's not good to look at, it hurts the experience, but also just kind of affects how you play the game a little bit. Like at this point, we all pretty much know The Last of Us pretty well here, and we can usually smoke a lot of sections, but like, it just doesn't feel right because the game is all stuttery. And that's what really feels like has been hurting the most for us. But anyway, even though it's the remake, which looks graphically great, it looked great on PlayStation 5, this is still a game that PC players have been waiting to play since the PS3 days. And it has been micro stutter city over here. Reports of crashes are widespread, but for us, after a few hours of play, we only experienced like one. It does, however, have some weird hangups where the game just freaks out for a second or flashes. And we have seen some pretty funny glitches being passed around online. With us, nothing that crazy, but just, we just couldn't get a solid experience out of it. And along with that, we just kept finding all kinds of weird choices and issues. Like The Last of Us always had a film grainy look, but here, for some reason, it's turned up to like 11, which is really like a weird default choice. And it made the game look so much worse. We turned that down immediately. And along with that, the load times are really long, like really long, like something is wrong, like despite our good hardware. And speaking of long, a significant issue we've had and we've seen reported by some other folks, compiling shaders. Now compiling shaders before firing up the game is great. It's a welcome feature, love to see it. Dead Space Remake did it, if you played that, you might remember that. We'll always wait for those guys to build, but something is wrong here. We sat watching that percentage meter for like well over an hour. Yes, serious, look up online and you'll find plenty of other people having the same or longer times. I've seen almost like two and a half hours for some people. And some people have had crashes in between all this. There's reports of memory leaks, basically anything you name it, it seems like there's an issue that's affecting someone. So what is going on? What happened here? We're not the only YouTube channel or website to point out that PC ports have been getting extra half-assed treatment lately, but this one just hurts even more. It's a game, you know, some people that I know, real absolute freaks that have been waiting for a PC version for forever and have managed to avoid spoilers of this game. It's also Sony's golden goose. I mean, it's The Last of Us, man. So how it got this kind of inconsistent treatment is beyond me. It had been delayed, as you probably remember, in their words, quote unquote, to make sure The Last of Us PC debut is in the best shape possible. And for seemingly for the majority of users, that hasn't ended up being the case. Why rush it out? Why half cook it? Especially considering Last of Us had a resurgence of popularity since the HBO show and everything that really popped off with mainstream audiences. Like they're releasing the game at the best possible time, but it seems like maybe they rushed it out. What's even more strange is that it is almost there. Like it has a good amount of options and supporting different setups. So in theory, it's a fully featured PC version that people would want. You know, the display options are pretty in depth. The graphical options are pretty staggering. Like you have a lot of control over every individual thing and the game menus are nicely detailed and show you what graphical feature has what effect on particular parts of your PC. It's all just broken down really nicely. And yet the game itself is tricky to run. Like it just seems poorly optimized and it's a huge shame. And then of course, like some people are going to ask, there's the Steam Deck. Okay, so get this. I was waiting for it to like load up on Steam Deck so I could give you guys a little offscreen demo of it not performing too well, but it like loaded for five minutes and then it hard crashed and it just rebooted. Oh God. Like the whole thing was bricked. It's finally back on. Thank God. But I don't know if I want to do that again. Okay, here we are trying again. Oh, oh, oh dude. Totally crashed again. I've seen other people get it like kind of running, but like this is well so much for this one. And I mean all of this is a shame because people who can't get it to run or, you know, end up deciding to wait before buying are just missing out on an otherwise great game. At this point, you've heard from us a bunch of times by now. Sure. Especially with the most recent PS5 remake. Sorry if I repeat myself, but The Last of Us Part One is a solid update of the original classic. It's the best way to play it. It looks and plays great in a perfect situation. It's a good package of a game in theory. You know, this remade version has better controls, more features, the cool weapon desk system, from part two, you're getting multiple difficulty modes, the ability to replay with different skins and cool cheats enabled and stuff like the add-on expansion left behind, which is the whole extra little bit of playable content that dives more into Ellie. Now sure, like the classic multiplayer factions isn't here from the original game, but it's still just a really good amount of stuff to play through. The PlayStation 5 Last of Us Part One is like the definitive version of the game. You know, whether or not you wanted to pay $70 for it and here on PC, this could have also been the definitive version of the game, but it's just not quite there yet. You know, I could spend a ton of time waxing nostalgic on the game and the story and everything, but most of you have probably experienced it or at least heard it from someone by now. It's a solid one. It's filled with memorable moments, scary, gory stuff, heartbreaking characters, grim reality, moments of beauty and wonder, you strangle dudes while looking them in the eye, you blow up creatures and you journey across a post-apocalyptic United States hitting people with bricks. There's just not many games like this in the world of games and, you know, PC fans could have really been experiencing something really good here and I think ultimately they will at some point. We've seen a lot of releases get cleaned up, but that's not excusing the fact that they put it out right now and they're asking for your money and you're getting something that there is a very good chance that it's not going to run well on your machine. Like I said, the community is probably going to figure out fixes before the developers even do, but this also gets in the way of the stuff I want to see. I want to see people really play the hell out of this game on insane, awesome settings. I want to see the community mod this and just do weird stuff. I want to see CJ from San Andreas and like Kermit the Frog as Joel and Ellie or some shit. I don't know how the PC community is like that stuff is so great, but these issues are getting in the way of what could have been just like a really fun, cool launch of a classic and honestly beloved game. It seemed like it was an easy win, but unfortunately it's just not there yet. We're just one account. We only tested this on our machine, so I do want to point out for people, do your research if you're still thinking about buying in on this, make sure you know what's up. Definitely read a couple of reviews. Obviously the steam reviews are popping off, but just like, you know, pick some other people, pick some other opinions because as of right now for us, we vote to wait on this one. Here's hoping they fix it soon, but that's a before you buy. You know how this goes by now. Just some quick first impressions. We give you some pros, some cons and some personal opinion, and now we want to hear yours. Did you jump in? How has your experience been? I know there are some people out there that haven't had issues, so if that's the case, hope you're liking the game so far. But if there are other people out there with issues, were you able to fix it in some way? Were you not? Did you get a refund? Let's talk about anything the last of us PC down in the comments. Is this video helped you out? Maybe gave you a heads up or something like that. All you got to do is click the like button. It legitimately helps us. So thank you. But we're putting out videos every day. So thank you guys very much for watching. We'll see in the next one.", 15 | "tokenCount": 2643, 16 | "summarizedChunks": [] 17 | }, 18 | "8ODz7Kx8_aQ": { 19 | "title": "OpenAI CEO explains GPT-4", 20 | "transcript": "High level, what is GPT for? How does it work and what to use most amazing about it? It's a system that we'll look back at and say was a very early AI. And it will, it's slow, it's buggy, it doesn't do a lot of things very well, but neither did the very earliest computers. And they still pointed a path to something that was going to be really important in our lives, even though it took a few decades to evolve. Do you think this is a pivotal moment? Like out of all the versions of GPT 50 years from now, when they look back at an early system, that was really kind of a leap in a Wikipedia.", 21 | "tokenCount": 143, 22 | "summarizedChunks": [] 23 | } 24 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | async@>=0.2.9: 6 | version "3.2.4" 7 | resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" 8 | integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== 9 | 10 | asynckit@^0.4.0: 11 | version "0.4.0" 12 | resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" 13 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 14 | 15 | axios@^1.3.4: 16 | version "1.3.4" 17 | resolved "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz" 18 | integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== 19 | dependencies: 20 | follow-redirects "^1.15.0" 21 | form-data "^4.0.0" 22 | proxy-from-env "^1.1.0" 23 | 24 | combined-stream@^1.0.8: 25 | version "1.0.8" 26 | resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" 27 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 28 | dependencies: 29 | delayed-stream "~1.0.0" 30 | 31 | delayed-stream@~1.0.0: 32 | version "1.0.0" 33 | resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" 34 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 35 | 36 | dotenv@^16.0.3: 37 | version "16.0.3" 38 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" 39 | integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== 40 | 41 | fluent-ffmpeg@^2.1.2: 42 | version "2.1.2" 43 | resolved "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz" 44 | integrity sha512-IZTB4kq5GK0DPp7sGQ0q/BWurGHffRtQQwVkiqDgeO6wYJLLV5ZhgNOQ65loZxxuPMKZKZcICCUnaGtlxBiR0Q== 45 | dependencies: 46 | async ">=0.2.9" 47 | which "^1.1.1" 48 | 49 | follow-redirects@^1.15.0: 50 | version "1.15.2" 51 | resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" 52 | integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== 53 | 54 | form-data@^4.0.0: 55 | version "4.0.0" 56 | resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" 57 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 58 | dependencies: 59 | asynckit "^0.4.0" 60 | combined-stream "^1.0.8" 61 | mime-types "^2.1.12" 62 | 63 | gpt-3-encoder@^1.1.4: 64 | version "1.1.4" 65 | resolved "https://registry.yarnpkg.com/gpt-3-encoder/-/gpt-3-encoder-1.1.4.tgz#d6cdaacf5824857e133b6065247c757fc7e4fa72" 66 | integrity sha512-fSQRePV+HUAhCn7+7HL7lNIXNm6eaFWFbNLOOGtmSJ0qJycyQvj60OvRlH7mee8xAMjBDNRdMXlMwjAbMTDjkg== 67 | 68 | isexe@^2.0.0: 69 | version "2.0.0" 70 | resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" 71 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 72 | 73 | m3u8stream@^0.8.6: 74 | version "0.8.6" 75 | resolved "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz" 76 | integrity sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA== 77 | dependencies: 78 | miniget "^4.2.2" 79 | sax "^1.2.4" 80 | 81 | mime-db@1.52.0: 82 | version "1.52.0" 83 | resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" 84 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 85 | 86 | mime-types@^2.1.12: 87 | version "2.1.35" 88 | resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" 89 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 90 | dependencies: 91 | mime-db "1.52.0" 92 | 93 | miniget@^4.2.2: 94 | version "4.2.2" 95 | resolved "https://registry.npmjs.org/miniget/-/miniget-4.2.2.tgz" 96 | integrity sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA== 97 | 98 | proxy-from-env@^1.1.0: 99 | version "1.1.0" 100 | resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" 101 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 102 | 103 | sax@^1.1.3, sax@^1.2.4: 104 | version "1.2.4" 105 | resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" 106 | integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 107 | 108 | which@^1.1.1: 109 | version "1.3.1" 110 | resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" 111 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 112 | dependencies: 113 | isexe "^2.0.0" 114 | 115 | word-wrap@^1.2.3: 116 | version "1.2.3" 117 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 118 | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 119 | 120 | ytdl-core@^4.11.3: 121 | version "4.11.3" 122 | resolved "https://registry.yarnpkg.com/ytdl-core/-/ytdl-core-4.11.3.tgz#0c95cc52b5bef87e9ef18818d75b1e2499fce729" 123 | integrity sha512-0KerQw+R7Nnhcebxq6WPopO92VLNnsoRVjJuhGhRzgfK1YdrnG1aqaq4zycolMBY+K8TZHXPV7ZNIjcawD/BPA== 124 | dependencies: 125 | m3u8stream "^0.8.6" 126 | miniget "^4.2.2" 127 | sax "^1.1.3" 128 | --------------------------------------------------------------------------------