- PVSM.RU - https://www.pvsm.ru -

YouTubeDrive: хранение файлов на YouTube

YouTubeDrive: хранение файлов на YouTube - 1

Хостинг [1] неограниченного размера? Звучит как нечто фантастическое и невозможное по законам природы. Примерно как вечный двигатель. Но что, если такое возможно? (не вечный двигатель, конечно, а неограниченный хостинг [1]).

Если подумать, ведь бесплатное хранилище неограниченного размера предоставляют десятки интернет-сервисов, от соцсетей до фотохостингов. Например, ограничение YouTube на размер одного видеоролика — 12 часов или 256 ГБ [2], но на количество видеороликов ограничений нет.

Теоретически нескольких видеороликов по 256 ГБ достаточно, чтобы спрятать в них зашифрованную копию своего SSD.

Единственное препятствие — они проверяют форматы файлов при загрузке, чтобы избежать злоупотребления сервисом. То есть чисто теоретически достаточно обойти эту проверку — и проблема решена. Но как её обойти?

Сразу приходит в голову вариант изменить расширение файла. Но сегодня такой вариант не проходит практически ни на одном хостинге [1], потому что они проверяют метаданные и содержимое файлов. Слишком легко отличить медиафайл от случайного набора бит.

Но что, если использовать методы стеганографии — и внедрять полезную нагрузку непосредственно в нативный медиафайл? И действительно, есть готовые инструменты для решения этой задачи. Вот некоторые из них.

Ещё раз подчеркнём — статья носит исключительно образовательный и чисто теоретический характер, материалы описанные в статье не являются руководством к действию и не нарушают законодательство.

YouTubeDrive

YouTubeDrive [3] — это пакет для Mathematica, который перекодирует любые файлы в пиксели RGB. То есть любой поток данных просто транскодируется в видеопоток — а потом обратно. Программа написана пять лет назад чисто для проверки концепции, что такое возможно (PoC).

Промежуточный видеоформат создаётся с единственной целью — для видеохостинга.

То есть схема такая:

АРХИВ ФАЙЛОВ → ВИДЕО → YOUTUBE → и обратно АРХИВ ФАЙЛОВ

YouTubeDrive написан на Wolfram Language (язык Mathematica). Он кодирует/декодирует произвольные данные, а видео автоматически загружаются и выгружаются с YouTube.

Поскольку YouTube не накладывает никаких ограничений на общее количество видео, которые могут загружать пользователи, это обеспечивает фактически неограниченный хостинг [1]. Правда, такой хостинг [1] чрезвычайно медленный, потому что процедура кодирования/декодирования занимает время сначала на локальном ПК, а затем ещё на YouTube.

Вот код пакета [4]. Разумеется, для его работы должна быть установлена сама программа Mathematica [5].

YouTubeDrive использует стандартные утилиты FFmpeg [6], youtube-upload [7] и youtube-dl [8]. Эти программы необходимо загрузить и установить отдельно, а перед первым использованием в пакете YouTubeDrive.wl (строчки 75–77) нужно указать места их установки:

FFmpegExecutablePath = "FFMPEG_PATH_HERE";
YouTubeUploadExecutablePath = "YOUTUBE-UPLOAD_PATH_HERE";
YouTubeDLExecutablePath = "YOUTUBE-DL_PATH_HERE";

Например, таким образом:

75 | FFmpegExecutablePath = "C:\ffmpeg.exe";
76 | YouTubeUploadExecutablePath = Sequence["python",
77 | "C:\Users\j0ker\AppData\Local\Programs\" <>
78 | "Python\Python35\Scripts\youtube-upload.py"];
79 | YouTubeDLExecutablePath = "C:\youtube-dl.exe";

После установки этих программ и изменения конфигурационных файлов можно открыть сам пакет YouTubeDrive.wl в программе Mathematica (через FileInstall...PackageFrom FileYouTubeDrive.wl).

YouTubeDrive: хранение файлов на YouTube - 2

Перед использованием с помощью youtube-upload загружаем тестовое видео в свой аккаунт, логинимся в YouTube — и получаем токен OAuth. Этот токен аутентификации понадобится для загрузки видеороликов через YouTubeDrive.

Алгоритм работы YouTubeDrive довольно понятен. В пакете две основные функции:

  • Функция YouTubeUpload[bytearr] кодирует массив данных bytearr как простое видео RGB, загружает на YouTube и возвращает ID видео.

    По умолчанию кодируется 64×36 пикселя RGB, которые масштабируются в 2304 квадратика 20×20 пикселей кадра 1280×720. Значения RGB только 0 или 255, то есть получается три бита на квадратик. Значения RGB записываются в файлы .PNG, которые с помощью кодека FFmpeg склеиваются в валидный видеоролик MP4, способный пережить дальнейшее транскодирование на сервере YouTube.

     Monitor[Do[Image`ImportExportDump`ImageWritePNG[
    "frame_" <> IntegerString[i, 10, numDigits] <> ".png", frame[i]],
    {i, numFrames}], ProgressIndicator[i, {1, numFrames}]];
    
    If[numLeftoverBytes > 0, Image`ImportExportDump`ImageWritePNG[
    "frame_" <> IntegerString[numFrames + 1, 10, numDigits] <> ".png",
    finalFrame]];
    
    Run[FFmpegExecutablePath,
    "-i", "frame_%0" <> ToString[numDigits] <> "d.png",
    "-c:v", "libx264", "-preset", "ultrafast",
    "-vf", "scale=1280:720", "-sws_flags", "neighbor", "data.mp4"];
    
    procInfo = RunProcess[{YouTubeUploadExecutablePath,
    "--title="DATA-" <> ToUpperCase@CreateUUID[] <> """,
    "data.mp4"}];

    В реальности транскодер YouTube может случайно поменять местами значения отдельных пикселей 0 и 255, поэтому большие квадраты 20×20 выполняют роль механизма коррекции ошибок.

  • Вторая функция YouTubeRetrieve возвращает видеоролик YouTube с указанным идентификатором ID videoid, декодирует его и возвращает полученные данные в видео объекта ByteArray:
     RunProcess[{FFmpegExecutablePath,
    "-i", FileNameJoin[{tempDir, videoFile}], "frame_%d.png"}];
    numFrames = Max[FromDigits /@ StringTake[FileNames["frame_*.png"], {7, -5}]];
    
    rdata = Monitor[Join @@ Table[ByteArray[FromDigits[#, 2] & /@
    Partition[Join @@ classify /@ Join @@ ImagePartition[
    First@Image`ImportExportDump`ImageReadPNG[
    "frame_" <> ToString[i] <> ".png"], 20], 8]],
    {i, numFrames - 1}], ProgressIndicator[i, {1, numFrames - 1}]];
    
    lastParts = Join @@ ImagePartition[First@Image`ImportExportDump`ImageReadPNG[
    "frame_" <> ToString[numFrames] <> ".png"], 20];
    numPaddedBits = LengthWhile[
    Reverse[Join @@ classifyLast /@ lastParts], EqualTo[1 / 2]];
    rdata = Join[rdata, ByteArray[FromDigits[#, 2] & /@ Partition[
    Drop[Join @@ classify /@ lastParts, -numPaddedBits], 8]]];

    Вот и всё.

Примечание. На самом сервере YouTube обработка маленького видеоролика размером около 10 МБ занимает примерно 5–10 минут. Таким образом, сразу после завершения YouTubeUpload[bytearr] файл ещё недоступен для скачивания, нужно немного подождать. Только потом можно запускать вызов YouTubeRetrieve.

Пример использования

Насколько мы поняли, для примера автор программы взял из функции Бесселя простенький ByteArray и запустил YouTubeUpload из нашего пакета. В программе Mathematica это делается примерно так:

YouTubeDrive: хранение файлов на YouTube - 3

Результат кодирования массива данных объёмом чуть больше 18 КБ в видеоформат выглядит следующим образом [9]:

Если интересно, можно скачать видеоролик и посмотреть на него, можно даже расшифровать вручную. Вместо youtube-dl для скачивания видео с YouTube сейчас обычно используют более продвинутый форк yt-dlp [10].

Список доступных форматов:

yt-dlp --list-formats "https://www.youtube.com/watch?v=Fmm1AeYmbNU"
[youtube] Fmm1AeYmbNU: Downloading webpage
[youtube] Fmm1AeYmbNU: Downloading android player API JSON
[info] Available formats for Fmm1AeYmbNU:
ID EXT RESOLUTION FPS │ FILESIZE TBR PROTO │ VCODEC VBR ACODEC ABR ASR MORE INFO
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
sb0 mhtml 48x27 │ mhtml │ images storyboard
139 m4a audio only │ 6.84KiB 54k https │ audio only mp4a.40.5 54k 22050Hz low, m4a_dash
249 webm audio only │ 700.00B 6k https │ audio only opus 6k 48000Hz low, webm_dash
250 webm audio only │ 700.00B 6k https │ audio only opus 6k 48000Hz low, webm_dash
140 m4a audio only │ 15.43KiB 136k https │ audio only mp4a.40.2 136k 44100Hz medium, m4a_dash
251 webm audio only │ 700.00B 6k https │ audio only opus 6k 48000Hz medium, webm_dash
17 3gp 176x144 6 │ 26.54KiB 222k https │ mp4v.20.3 222k mp4a.40.2 0k 22050Hz 144p
394 mp4 256x144 25 │ 25.28KiB 235k https │ av01.0.00M.08 235k video only 144p, mp4_dash
160 mp4 256x144 25 │ 82.20KiB 765k https │ avc1.4d400c 765k video only 144p, mp4_dash
278 webm 256x144 25 │ 72.33KiB 673k https │ vp9 673k video only 144p, webm_dash
395 mp4 426x240 25 │ 66.86KiB 622k https │ av01.0.00M.08 622k video only 240p, mp4_dash
133 mp4 426x240 25 │ 254.76KiB 2371k https │ avc1.4d4015 2371k video only 240p, mp4_dash
242 webm 426x240 25 │ 163.19KiB 1519k https │ vp9 1519k video only 240p, webm_dash
396 mp4 640x360 25 │ 89.98KiB 837k https │ av01.0.01M.08 837k video only 360p, mp4_dash
134 mp4 640x360 25 │ 363.73KiB 3386k https │ avc1.4d401e 3386k video only 360p, mp4_dash
18 mp4 640x360 25 │ ~440.62KiB 3524k https │ avc1.42001E 3524k mp4a.40.2 0k 44100Hz 360p
243 webm 640x360 25 │ 238.27KiB 2218k https │ vp9 2218k video only 360p, webm_dash
397 mp4 854x480 25 │ 116.18KiB 1081k https │ av01.0.04M.08 1081k video only 480p, mp4_dash
135 mp4 854x480 25 │ 469.24KiB 4368k https │ avc1.4d401e 4368k video only 480p, mp4_dash
244 webm 854x480 25 │ 298.72KiB 2780k https │ vp9 2780k video only 480p, webm_dash
398 mp4 1280x720 25 │ 150.16KiB 1397k https │ av01.0.05M.08 1397k video only 720p, mp4_dash
136 mp4 1280x720 25 │ 512.91KiB 4774k https │ avc1.64001f 4774k video only 720p, mp4_dash
22 mp4 1280x720 25 │ ~614.20KiB 4913k https │ avc1.64001F 4913k mp4a.40.2 0k 44100Hz 720p
247 webm 1280x720 25 │ 380.61KiB 3543k https │ vp9 3543k video only 720p, webm_dash

Скачиваем формат 22:

yt-dlp --format 22 "https://www.youtube.com/watch?v=Fmm1AeYmbNU"
[youtube] Fmm1AeYmbNU: Downloading webpage
[youtube] Fmm1AeYmbNU: Downloading android player API JSON
[info] Fmm1AeYmbNU: Downloading 1 format(s): 22
[download] Destination: DATA-34DFE96A-BFE6-4405-A9E3-CFB9959CD3CA [Fmm1AeYmbNU].mp4
[download] 100% of 527.20KiB in 00:00

На этом файле в Mathematica можно запустить функцию YouTubeRetrieve из пакета YouTubeDrive, которая выполнит обратное преобразование.

Конечно, такая схема кодирования не очень эффективна — примерно 1 минута видео на 1 МБ информации. Этот параметр можно легко увеличить на порядок (до 10 МБ на минуту видео), если вместо квадратов 20×20 внедрить какой-нибудь нормальный алгоритм коррекции ошибок [11].

YouTubeDrive — чисто экспериментальная программа. Автор подчёркивает, что ни в коем случае не поддерживает её использование в промышленных масштабах. Как мы уже сказали, программа написана пять лет назад чисто для доказательства концепции.

YouBit

Идея хранилища файлов на YouTube выглядит весьма привлекательно. Два года назад появилась программка fvid [12], которая кодирует файлы без необходимости устанавливать Mathematica. Из зависимостей ей нужен только FFmpeg и libmagic.

Она работает проще. Кодирование произвольного файла в видеоформат:

fvid -i [input file] -e
fvid -i [input file] --framerate 1 -e
fvid -i [input file] --password "xyz" -e

Декодирование:

fvid -i [input video] -d

В продолжение этой темы недавно вышла утилита YouBit [13]. Так сказать, последнее достижение прогресса в данной области.

По сравнению с предшественниками — YouBit значительно усовершенствован. Можно сказать, что это новый уровень по качеству кодирования.

Во-первых, здесь автор отказался от использования цветовой субдискретизации [14], а всю информации кодирует только в канале яркости. В результате получаются чёрно-белые видеоролики, но зато кодирование и декодирование становятся заметно проще — и выполняются быстрее.

В канале яркости пиксели принимают значение от 0 до 255. Соответственно, если мы кодируем в пикселе один бит (параметр bpp: 1, то все значения от 128 до 255 воспринимаются как единица, а меньшие значения — как 0. Для примера, если кодировать в одном пикселе два бита (00, 01, 10 или 11), то весь диапазон яркости разбивается на четыре области (0–63, 64–127, 128–191, 192–255) и так далее. Чем больше бит на пиксель, тем меньше размер файла и выше вероятность некорректной расшифровки конкретного бита после транскодирования видео на серверах YouTube.

Во-вторых, автор придумал оригинальный способ оптимизации видеороликов конкретно под специфический энкодер YouTube, чтобы повысить надёжность их последующего декодирования. Правда, теперь для успешного декодирования файлов уже необходимо их сначала залить на YouTube, а потом скачать результат.

В-третьих, YouBit работает с видео любого разрешения. Оптимально 1920×1080.

Наконец (в-четвёртых), автор реализовал функцию «нулевых фреймов» — вставки чёрных кадров между кадрами с полезной нагрузкой, что позволяет снизить битрейт примерно на 40% (и размер файла) при кодировании видео на сервере YouTube.

Использование:

python -m youbit upload C:/myfile.txt chrome

Аргумент chrome указывает, из какого браузера YouBit должен извлечь куки для аутентификации на YouTube (соответственно, этот браузер должен авторизоваться на studio.youtube.com/ [15], открыть сессию и получить куку).

Затем загрузка происходит непосредственно с помощью headless-браузера Selenium [16] в фоновом режиме. Очень грамотный подход.

Скачивание и обратное декодирование видео:

python -m youbit download https://youtu.be/dQw4w9WgXcQ

Декодирование локального видео, скачанного с YouTube:

python -m youbit decode C:/myvideo.mp4

Все операции можно выполнять через Python API.

Пример видео [17]:

Как мы уже говорили, ограничения YouTube на размер видеоролика — 12 часов или 256 ГБ. Если аккаунт не верифицирован, ограничение 15 минут.

Настройка YouBit по умолчанию на размер одного файла — 9 ГБ, но её можно скорректировать при желании.

Неограниченный хостинг в других местах

Неограниченные хранилища файлов предоставляют и другие сервисы, например:

  • Telegram (ограничение по размеру файлов 2 ГБ, в платной версии 4 ГБ)
  • Соцсети (любые файлы можно хранить под видом видеозаписей и фотографий), обычно там хостинг [1] неограниченного размера
  • Habrastorage

Для работы с этими «нетрадиционными хостингами» можно написать свой клиент/файл-менеджер — небольшую программку для закачки файлов через YouBit, чтобы не запускать её вручную.

В идеале хотелось бы добавить туда следующие функции:

  • Поддержка разных хостингов (разные соцсети, фото- и видеохостинги), чтобы YouBit копировал видео с нашими файлами не только на YouTube, но и на другие хостинги, которые предоставляют неограниченное дисковое пространство бесплатно.
  • Резервное копирование. Поскольку каждая площадка рассматривается как временная, должно быть предусмотрено избыточное дублирование.
  • Грамотная синхронизация: обновление новых версий или новых файлов без переписывания всего архива.

Но это в идеале. В минимальном варианте хватит и простого скрипта, который в пакетном режиме просто кодирует через YouBit пару сотен файлов в формат MP4 — и заливает видеофайл на несколько видеохостингов.

Что касается хранения файлов на YouTube (и в других сервисах крупных корпораций) — суть сводится к тому, чтобы использовать инфраструктуру не совсем так, как это предполагается, но при этом совершенно легально. Повторюсь, если пользователь маскирует свои личные файлы под видеоролики и заливает их на публичный хостинг [1], он никак не нарушает законодательство ни одной страны. В любом случае это не коммерческая программа, а просто теоретический эксперимент, а повторять его или нет — решать вам.


НЛО прилетело и оставило здесь промокод для читателей нашего блога:

15% на все тарифы VDS [18] (кроме тарифа Прогрев) — HABRFIRSTVDS.

Автор:
FirstJohn

Источник [19]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/youtube-2/377125

Ссылки в тексте:

[1] Хостинг: https://www.reg.ru/?rlink=reflink-717

[2] 12 часов или 256 ГБ: https://support.google.com/youtube/answer/71673?hl=EN

[3] YouTubeDrive: https://github.com/dzhang314/YouTubeDrive

[4] код пакета: https://github.com/dzhang314/YouTubeDrive/blob/master/YouTubeDrive.wl

[5] Mathematica: https://www.wolfram.com/mathematica/

[6] FFmpeg: https://ffmpeg.org/

[7] youtube-upload: https://github.com/tokland/youtube-upload

[8] youtube-dl: https://rg3.github.io/youtube-dl/

[9] выглядит следующим образом: https://www.youtube.com/watch?v=Fmm1AeYmbNU

[10] yt-dlp: https://github.com/yt-dlp/yt-dlp

[11] алгоритм коррекции ошибок: https://habr.com/ru/company/first/blog/673582/#:~:text=%D0%98%D1%81%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B1%D0%B8%D1%82%D1%84%D0%BB%D0%B8%D0%BF%D0%BE%D0%B2

[12] fvid: https://github.com/AlfredoSequeida/fvid

[13] YouBit: https://github.com/MeViMo/youbit

[14] цветовой субдискретизации: https://en.wikipedia.org/wiki/Chroma_subsampling

[15] studio.youtube.com/: https://studio.youtube.com/

[16] Selenium: https://www.selenium.dev/

[17] Пример видео: https://www.youtube.com/watch?v=dnhlx48t-h4

[18] 15% на все тарифы VDS: https://firstvds.ru/?utm_source=habr&utm_medium=article&utm_campaign=product&utm_content=vds15exeptprogrev

[19] Источник: https://habr.com/ru/post/676282/?utm_source=habrahabr&utm_medium=rss&utm_campaign=676282