Я выступил с докладом на WordCamp US 2023 и захотел скачать видео с ним. Я всегда стараюсь хранить собственные копии таких видео, потому что некоторые конференции в прошлом со временем закрывали к ним доступ. Моя презентация в прямом эфире транслировалась через YouTube, однако получившееся видео длится 9,5 часа! В обычной ситуации я бы скачал видео полностью и обрезал его локально, но тогда я был подключен к WiFi конференции и не хотел ждать всего файла, поэтому решил проверить, можно ли скачать его часть. Я нашёл этот рецепт пользователя StackExchange godofgrunts, который походил на то, что мне нужно: Но когда я запустил его, то получил ошибку, потому что на моём Mac не было readarray. Поэтому я вставил команды в GPT-4 со следующим промтом: Port this to macOS — I do not have the readarray command «Портируй это на macOS — у меня нет команды readarray» Он выдал мне такое: 1. Переменной IFS присвоен символ новой строки, чтобы возвращаемые yt-dlp URL разделялись по новым строкам. 2. Массив urls заполняется подстановкой команды и присвоением массива. 3. Остальная часть скрипта осталась неизменной. Я сохранил команды как clip-youtube.sh, выполнил chmod 755 clip-youtube.sh и... это сработало! Я вызвал код следующим образом: Моя часть видео начинается примерно с 8 ч 18 мин и 25 с. Я указал 3600, чтобы скачать час контента (раздел Q&A длился немного больше, нужно было указать большее значение). Для выполнения скрипта потребовался почти целый час! В конечном итоге, возможно, было бы быстрее скачать файл целиком, а потом нарезать его. Но... в результате я получил файл simon-wordcamp.mp4 на 308 МБ. Немного объясню код. Первая часть выглядит так: Выполнив её, мы получим такой результат: Вывод: Я немного поискал и выяснил, что --youtube-skip-dash-manifest больше не нужен. То есть на самом деле команда будет такой: Опция -g заставляет yt-dlp создать URL стримов, а не скачивать видео. Команда возвращает два URL, потому что один относится к видеопотоку, а другой — к аудиопотоку. Мы можем переформатировать эти URL, чтобы это стало очевиднее — подсказка заключается в том, что в первом случае используется &mime=video%2Fmp4 , а во втором — &mime=audio%2Fwebm. Затем скрипт вызывает ffmpeg. Вот очищенная версия этого вызова: Две строки -ss выполняют поиск отметки 8:18:25 в видеопотоке и в аудиопотоке. --s 5 выполняет поиск на 5 секунд внутрь скомбинированного вывода. В инструкциях на StackExchange говорится, что нужно начинать как минимум за 5 с до той части видео, которую вы хотите сохранить. В рецепте с StackExchange указано, что это нужно «для того, чтобы дать несколько секунд на поиск хорошего ключевого кадра». -map 0:v и -map 1:a задают первый поток как видео, а второй — как аудио. -c:v libx264 и -c:a aac конфигурируют выходные кодеки для видео (H.264) и аудио (AAC). -t 3600 simon-wordcamp.mp4 задаёт длительность (час, или 60 * 60 секунд) и имя выходного файла. Прим. пер.:  вообще для решения задачи можно было использовать встроенную в yt-dlp функцию --download-sections, но текст всё равно интересен необычностью изложенной идеи. Exporting and editing a Twitter Spaces recording — 23.03.2022 Syncing slide images and audio in iMovie — 15.06.2023 Reading thermometer temperatures over time from a video — 02.04.2023 Trick Apple Photos into letting you access your video files — 12.04.2022 Running nanoGPT on a MacBook M2 to generate terrible Shakespeare — 01.02.2023 sips: Scriptable image processing system — 18.02.2023 Set a GIF to loop using ImageMagick — 03.08.2021 Rewriting a repo to contain the history of just specific files — 22.03.2022 Compiling to WASM with llvm on macOS — 28.03.2022 Using curl to run GraphQL queries from the command line — 21.02.2022  Переводчик-фрилансер