YouTube Embedded RU : Что "под капотом"
Опубликовано: Бармалей · 25.05.2018 · 00:02 ••• Обновление: 19.11.2022 · 11:23 0

Некоторые технические подробности по исходному коду расширения YouTube Embedded RU.
Применяемые технологии и API. Особенности настройки и использования. Локализация.


…Как понимаю, вы уже прочитали общий обзор и хотите поглубже разобраться что и как в этом аддоне…)

Всё верно, работа с любым расширением требует понимания его особенностей, это позволит вам избежать "непонятных" проблем при эксплуатации аддона. Итак, приступим…


В этой статье:


Некоторые отличия от вероятных аналогов

По отношению к другим подобным расширениям в YouTube Embedded RU имеются следующие отличия:

  • Аддон оптимизирован для работы на любых версиях хром-браузеров, код проверен на версиях 29-87.
  • Аддон не требует для работы никаких сторонних библиотек, весь код полностью написан на чистом JS.
  • Аддон не потребляет резурсов в покое и автоматически выгружается из памяти (быстрая выгрузка).
  • Аддон работает полностью автономно, не использует синхронизацию,все настройки сохраняются локально.
  • Отсутствует гуглоаналитика и сбор статистики, для работы не требуются учётные записи пользователя.
  • Аддон построен как модульная структура из отдельных компонентов, подгружаемых по необходимости.
  • Высокая скорость работы за счёт оптимизации кода, интерфейс управления прост и интуитивно понятен.
  • Весь интерфейс полностью на русском языке, включая все меню, сообщения, диалоги и описание.
  • В комплект входят только необходимые файлы, установщик аддона имеет минимальный размер.

Технические особенности разработки

Ниже приведены технические особенности расширения и некоторые подробности по исходному коду.


Особенности работы скрипта-инжектора

Основные функции обработки содержимого страниц видео-роликов, включая проверку и применение сохранённых настроек и запуск вспомогательных скриптов (например, скрипта-загрузчика), возложены на инжект-скрипты, которые загружаются на страницах YouTube автоматически и в соответствии с заданной в манифесте маской URL. Загрузка инжектора не связана с работой фонового скрипта и не приводит к вызову каких-либо функций самого расширения.

В частности, скрипты-инжекторы в текущей версии YouTube Embedded RU отвечают за:

  • автоматический останов воспроизведения видео-ролика при загрузке страницы;
  • отрисовку "экранной кнопки" для вызова внешнего медиа-загрузчика и управления им;
  • получение ссылок для прямой загрузки медиа-файлов в доступных аудио и видео форматах (скрипт-загрузчик);
  • управление внешним видом страниц и отключение отдельных "мешающих" элементов (комментарии и пр.);
  • управление режимом отображения плейера в мобильной или desktop-версиях (режим "кинотеатр");
  • цветовую коррекцию основного видео ролика (яркость, контраст, насыщенность, баланс цветов);
  • принудительное переключение используемых кодеков и фреймрейта видео-потока (MP4@30fps);
  • проверку и включение режима безопасного просмотра (фильтрация контента);
  • переключение и удержание страниц сайта YouTube в мобильном режиме.

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

Начиная с версии 2019.10.8 применение автостопа определяется настройкой "Авто-стоп плейера при загрузке". Если эта настройка НЕ менялась после установки, автостоп применяется безусловно (как в предыдущих версиях).

Временное отключение автостопа происходит при загрузке страницы с зажатой клавишей Shift. Это удобно, например, если ролик открывается в активной вкладке/окне – не нужно "тыкать" кнопку воспроизведения.

Для удобства использования клавиатуры после автостопа фокус переводится на сам ролик (старт/стоп – пробелом).

С версии 2018.6.2 скрипт-инжектор отвечает и за отрисовку кнопки управления панелью загрузки:

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

С версии 2018.6.7 к этой же кнопке добавлены дополнительные функции, (назначение указано в подсказке):

При переходах в пределах вкладки перерисовка кнопки не требуется, но саму панель загрузки придётся вызывать повторно. Также, после первого же вызова панели, навигация во вкладке будет с её перезагрузкой – это не баг, это "фича" самого YouTube.)

С версии 2022.10.25 внешний скрипт* загрузки заменён, панель загрузки теперь выглядит так:

* Замена связана с частичной неработоспособностью ранее используемого скрипта, не отдающего все доступные медиа-форматы для части роликов. Функционально результат работы скриптов одинаков, получаемые прямые ссылки на медиа-файлы могут быть загружены в любой из версий.

В версии 2022.11.6 функционал "кнопки" вызова загрузчика доработан, улучшена "отзывчивость" кнопки (события mouseover/mouseout заменены на mouseenter/mouseleave) и добавлена фича отслеживания переключений текущего режима плейера (широкоэкранный или обычный) с динамическим изменением подсказки о доступных действиях.

В этой же версии введено ограничение на ожидание готовности главного видео на странице ролика (30 секунд).

Это жёстко ограничивает максимальное время ожидания* загрузки видео для срабатывания автостопа и отрисовки "кнопки" вызова загрузчика. При превышении этого времени отслеживание готовности прекращается, автостопа не будет. Также не будет "кнопки" загрузчика в плейере и не будет выполняться очистка комментариев и отключение блока "рекомендуемых" (если задано в настройках просмотра).

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

В версии 2022.11.17 функционал "кнопки" вызова загрузчика доработан в рамках интеграции с внешними скриптами загрузчика, изменён принцип детекта уже созданной панели форматов текущего ролика.

Доработка связана с тем, что по умолчанию в скрипте "YouTube Media Direct" панель форматов не выводится (вызов по требованию). Автор альтернативного скрипта, "YouTube Links", в текущей версии кнопку отключил (по умолчанию там панель форматов текущего ролика всегда выводится сразу же при запуске скрипта).

Теперь инжектор проверяет не только наличие самой панели форматов загружаемых файлов, но и экранной кнопки её вызова, выводимой самим скриптом загрузчика (в первую очередь). Если обнаружена кнопка – инжектор выполняет по ней "виртуальный щелчок", при этом переключение видимости панели форматов текущего ролика выполняется уже средствами самого загрузчика. При отсутствии кнопки (зависит от выбранного скрипта и параметров его настроек) инжектор скрывает/показывает панель самостоятельно (как это было в предыдущих версиях аддона).

В этой же версии в расширение добавлена отдельная группа настроек загрузчика для удобства "тюнинга" параметров скриптов (группа опций и действий "Настройки загрузчика"). С помощью настроек этой группы Пользователь может, например, управлять автоотображением панели форматов ролика, выбором единиц измерения размеров файлов и т.д..

Назначение пунктов настроек группы в целом понятно из их названий и подробно описано в документации. В браузерах версий старше CR48 группа отображается (как и все остальные настройки) в меню только на страницах сайта YouTube. В более новых версиях группа отображается в контекстном меню кнопки на тулбаре. Никаких отличий в наборе опций и их функциональности при этом нет.

Как и другие настройки, относящиеся непосредственно к сайту YT (просмотр, скачивание и т.д.), изменение настроек в этой группе возможно только на страницах основного сайта (www.youtube…). Попытка вызова любого из пунктов этой группы на других страницах приведёт к отказу в выполнении действия с выдачей соответствующего предупреждения.

Кроме того, теперь можно выбрать конкретный используемый скрипт (опция "Загрузчик YouTube Media Direct", если она выключена – используется скрипт "YouTube Links") и/или сбросить все настройки скрипта, установив значения по умолчанию (опция "Сбросить все настройки загрузчика").

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

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

Эти настройки применяются независимо от версии браузера и конкретного скрипта загрузчика ("YouTube Media Direct" или "YouTube Links"). Максимальное число настроек доступно для скрипта "YouTube Media Direct" (включая копирование по ПКМ, открытие выбранного файла по двойному щелчку и т.д.). При выборе альтернативного загрузчика часть настроек отключается (неприменимы к этому скрипту и будут недоступны для изменения).

Помимо автостопа, с версии 2019.10.5 скрипт-инжектор отвечает за отработку опций воспроизведения видео.
Подробнее о применяемых методах читаем в описании расширения-прототипа или на странице этого проекта на GitHub.

В частности, за настройки кодека и фреймрейта, индицируются на панели плейера справа от счётчика длительности:

Опция принудительного воспроизведение видео в формате MP4/H.264 включается пунктом "Видео-кодек: только MP4/H264". Эта опция запрещает использование формата WEBM с кодеками VP9 (устанавливается по умолчанию на YouTube, вызывает повышенную загрузку CPU).

Опция может значительно уменьшить нагрузку на CPU (и снизить нагрев) при использовании ускорителя видеокарты. Имеет смысл при включенном аппаратном ускорении, улучшает плавность воспроизведения HD-роликов.

Этот режим индицируется жёлтой надписью 'MP4' справа от счётчика длительности ролика.

Опция ограничения максимальной кадровой частоты видео (пункт "Видео-поток: не более 30 кадр/сек") запрещает использование потоков с бо́льшим фреймрейтом (по умолчанию FPS устанавливается автоматически, до 60). Уменьшает нагрузку на CPU (и нагрев) и снижает расход трафика на медленном/ограниченном соединении.

Этот режим индицируется жёлтой надписью 'Max.FPS = 30' справа от счётчика длительности ролика.

Обе эти опции снижают число пропущенных кадров и могут применяться на мобильных компьютерах для увеличения времени работы от батареи и/или во избежание лишнего перерасхода ограниченного трафика. Опции имеют* смысл при медленном/ограниченном соединении и/или на слабых компьютерах, улучшая плавность воспроизведения HD-роликов.

* Реальный результат от применения этих настроек, полученный на ноутбуке 2009 г.в. при использовании мобильного интернета: видео 1080р идёт с редкими потерями единичных кадров при загрузке CPU до 50%, видео 720р – полностью без потерь, загрузка CPU до 20-25%.

С версии 2019.10.9 на старых версиях браузеров доступна ещё одна опция управления кодеками:

Принудительное воспроизведение видео в формате WEBM/VP8 (пункт "Видео-кодек: запретить WEBM/VP9"). Запрещает использование формата WEBM с кодеками VP9 ("даунгрейд" до VP8-only браузера при проблемах со звуком). Имеет смысл на браузерах с кривой поддержкой VP9 при отсутствии поддержки MP4/H264 (например, в SRWare Iron 36).

Эта опция отсутствует в настройках на браузерах с поддержкой MP4 (48+) и на совсем старых (VP8-only) браузерах, поддержка браузером различных медиа-форматов проверяется автоматически при построении меню настроек.

Если включено – для воспроизведения следует использовать этот совет* (выдача в формате VP8 ограничена на Youtube). При этом качество ролика будет только 360p и в embed-режиме "играть" НЕ будет (в фулл-скрин – можно).

* Не работает с осени 2020 года, связано с полным отказом от поддержки формата VP8 на сервисе YouTube…

Режим индицируется жёлтой надписью 'VP8' справа от счётчика длительности ролика.

Реально используемые кодек и фреймрейт смотрим в блоке "Статистика для сисадминов" ("Stats for nerds"), который можно вызвать из штатного меню стандартного плейера (выводится для любого ролика на YouTube, в том числе – в мобильной версии сайта).

Принудительное отключение комментариев (пункт "Отключить загрузку комментариев") блокирует загрузку и вывод комментариев (скрывает соответствующий блок стилем и удаляет его из кода страницы). Эта опция значительно улучшает "отзывчивость" страниц YouTube, в том числе – в мобильной версии сайта.

Принудительное отключение рекомендуемых видео (пункт "Не выводить список рекомендуемых", добавлен с версии 2022.10.25) блокирует загрузку и вывод этого блока (скрывает соответствующий блок стилем и удаляет его из кода страницы). Эта опция также улучшает "отзывчивость" страниц YouTube, в том числе – в мобильной версии сайта.

Цветовая коррекция видео – регулировка яркости, контрастности, насыщенности и цветового баланса (пункт меню "Применять цветокоррекцию видео", добавлен с версии 2022.10.25). Эта опция также работает через инжектор и применяется (если включена) ко всем* просматриваемым видео-роликам.

* Фильтр работает на всех страницах YouTube, включая мобильную версию и режим "embedded-плейера" (в т.ч. – на всех сторонних сайтах, на страницах которых присутствуют фреймы видео с YouTube).

Фильтр применяется на лету, без перезагрузки текущей страницы. В дальнейшем включается автоматически, до изменения этой настройки. Эта настройка может быть полезна в некоторых браузерах, имеющих некорректную цветопередачу (в частности, на движках CR49).

Кроме того, есть и возможность самостоятельной* правки CSS этого фильтра, если не устраивают его параметры по умолчанию. Редактирование собственного стиля доступно через пункт меню "Задать CSS цветовой коррекции" (в той же группе настроек), вызывающего диалоговое окно правки, сохранения или сброса параметров:

* В окне ввода следует указывать только параметры фильтра, сам оператор фильтра (--webkit-filter, как и параметр !important) вводить НЕ нужно (приведёт к ошибке!). В случае, если "что-то пошло не так", в этом же диалоге можно сбросить настройку, введя цифру 0 или 1 (разница указана в пояснение в диалоге).

Кроме указанных настроек, начиная с версии 2022.10.25 в расширение добавлены и другие опции, облегчающие работу с "тяжеловесным" дизайном сервиса, а также позволяющие использовать более гибкие настройки внешних сервисов просмотра и загрузки роликов.

Расширение также содержит ряд других сервисных функций, доступных через контекстное меню. Подробное описание всех этих настроек и опций доступно в статье YouTube Embedded RU : Настройки и управление.


Важное примечание по настройке браузера

Как уже говорилось, для работы с настройками инжектор YouTube Embedded RU использует локальное хранилище куки в браузере, привязанное непосредственно к сайту YouTube. Соответственно, при удалении (очистке) этого хранилища настройки станут недоступны для инжектора и никакие установленные вами опции (в группе "Настройки просмотра") НЕ будут применяться. При этом на сайте YouTube также будет выдаваться предупреждающее сообщение, повторяющееся до момента восстановления настроек в куках:

Инжектор также не сможет получить заданные вами настройки при частичном/полном запрете сохранения и обработки куки в настройках браузера. Эти настройки находятся на служебной странице chrome://settings/content и могут быть изменены* пользователем.

* Кроме того, особые настройки куки могут быть также заданы вашим системным администратором через групповые политики или с помощью некоторых расширений, управляющих настройками приватности (например, продвинутыми блокировщиками рекламы, аддонами для управления куки и другими подобными).

В частности, при настройке, указанной на скриншоте ниже, напоминание об отсутствии куки будет выдано каждый раз при посещении сайта YouTube после каждого перезапуска браузера, поскольку в этом случае восстановленные вами куки будут автоматически стираться при завершении браузерной сессии:

Соответственно, для нормальной работы расширения настройка куки для сайта YouTube должна быть такой, чтобы эти опции были доступны инжектору. Это или рекомендованная настройка по умолчанию ("Разрешать сохранение"), или настройка исключений (список доступен по нажатию соответствующей кнопки на скриншоте выше или на странице chrome://settings/contentExceptions#cookies):

Поскольку кроме основного сайта YouTube расширение работает и в его мобильной версии, при использовании списка исключений имя домена следует указывать именно так, как показано на скриншоте выше (.youtube.com).

Кроме того, для полноценной* работы инжектора расширения во фреймах (все встроенные видео с YouTube на сторонних сайтах) также НЕ должно быть запрещено использование сторонних куки на сайтах (настройка "Блокировать данные и файлы cookie сторонних сайтов" должна быть ВЫКЛючена).

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

В любом случае, в отличие от основных страниц сайта YouTube, на любом стороннем сайте (при наличии на странице роликов в режиме embedded-плейера) никогда НЕ выдаётся вышеописанное сообщение о проблемах доступа к куки. Это сделано чисто из практических соображений, чтобы "лишний раз не пугать юзера".. %))

В отношении операции восстановления (или изменения) настроек в куки следует помнить, что:
  1. Восстановление вызывается пунктом "Восстановить настройки в куки" (в группе "Настройки просмотра").

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

  2. Эта операция может быть выполнена только непосредственно на сайте YouTube (на любой его странице).

    Это ограничение связано с тем, что при изменении или восстановлении настроек производится прямая запись в локальное хранилище куки в браузере и, соответственно, эта операция делается с привязкой "по текущему месту" (в текущей вкладке должна быть открыта страница основной или мобильной версии сайта).

    При несоблюдении этого условия (например, при вызове вне страниц сайта YouTube), любая попытка изменения или восстановления настроек просмотра будет отклонена и приведёт к выдаче сообщения о недопустимости выбранного действия в контексте текущей вкладки.

    Это относится и к попытке вызова Панели загрузчика из меню на тулбаре (пункт "Панель загрузчика") на любой вкладке, не являющейся страницей основного сайта YouTube (на сторонних сайтах, в мобильной версии или в окне embedded-плейера).

  3. Аналогичные действия выполняются каждый раз при изменении любой из опций в группе "Настройки просмотра".

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

  4. Для надёжности проверка текущих параметров настроек в куки выполняется инжектором в несколько этапов.

    В частности, эта проверка производится для отдельных "критичных" настроек, связанных с работой функции очистки страниц. Кроме того, проверка всегда выполняется на основных страницах видеороликов при попытке вызова подключаемого скрипта загрузчика (как одно из условий его гарантированного запуска).

  5. Часть изменений настроек отрабатывается инжектором "на лету", большинство требует перезагрузки страницы.

    Если, например, вы изменили CSS цветокоррекции, перезагрузка текущей страницы не требуется. Тем не менее, для гарантированной отработки изменений настроек желательно просто перегрузить текущую страницу (либо включить в настройках опцию "Автоперезагрузка при изменениях"). В последнем случае "решение" о перезагрузке принимается аддоном автоматически и зависит от конкретной изменённой настройки.


Примеры корректно распознаваемых ссылок

Как уже было отмечено, кроме прямых ссылок, YouTube Embedded RU умеет находить ссылки на видео-ролики в выделенном тексте и открывать их в режиме "только плейер". Эта функция может использоваться для распознавания текстовых ссылок (в том числе – неполных) на видео-ролики (по умолчанию функция выключена, включить её можно в настройках, пункт "Искать ссылки в выделенном тексте").

Аддон "понимает" только URL домена .com (.ru и иные вариации не предусмотрены – конечная ссылка ведёт на .com).

Корректно распознаются ссылки на YouTube-ролики с основного и некоторых других доменов:

  • (www.|m.)youtube.com/watch*, youtu.be/* – основной/мобильный домен и домен коротких ссылок на ролики;
  • (www.)youtube.com/embed/*, www.youtube-nocookie.com/embed/*, youtube.googleapis.com/embed/*;
  • (www.)youtube.com/shorts/*, www.youtube-nocookie.com/shorts/*, youtube.googleapis.com/shorts/*;
  • (www.)youtube.com/v/*, www.youtube-nocookie.com/v/*, youtube.googleapis.com/v/* – "старый" формат ссылок;
  • кроме указанных корректно распознаются "урезанные" ссылки на ролики (только домен, без указания 'www.').

Все дополнительные функции производят вычисление ID видео-ролика и выполняют редирект на соответствующий сервис. Для текстовых ссылок протокол (http(s)://) может и отсутствовать, главное – корректный идентификатор* видео.

* В любом случае, после получения или распознавания URL видео-ролика перед непосредственным запуском любой из функций проверяется корректность его ID (длина = 11 символов из набора [a-zA-Z0-9-_]). Сообщения об ошибках обработки "неправильных" URL ссылок выдаются в виде стандартных "алертов".

Допустимые URL:

Допустимые текстовые URL (выделить и нажать ПКМ):

  • youtu.be/XRCIzZHpFtY
  • youtube.com/watch?v=XRCIzZHpFtY
  • //www.youtube.com/embed/XRCIzZHpFtY

Некорректные URL:


Исходный код, интерфейс и API

YouTube Embedded RU не использует для работы никакие сторонние библиотеки (привет любителям JQuery)).

В коде применён только чистый JS (ES5), неподдерживаемые в "старых" браузерах функции отсутствуют.

Диалоговые окна и сообщения реализованы только с помощью стандартных операторов alert/prompt/confirm.

Скрипты работают в "строгом" режиме – для гарантированного выполнения функций и облегчения отлова ошибок.

Аддон загружается только в момент вызова, не имеет фонового процесса и не занимает память в покое.

Кроме того, добавлена опция ускоренной выгрузки расширения из памяти после выполнения требуемых действий.

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

Для работы с содержимым страниц задействуется API chrome.tabs. Прямого запроса прав доступа для указанного API при этом не требуется, в манифесте аддона запрашивается только разрешение activeTab, упрощающее действия на текущих страницах.

В версиях 2018*/2019* для переключения на режим плейера и обратно при щелчке по кнопке в омнибоксе применялся API chrome.pageAction. Для отрисовки кнопки на всех вкладках использовался API chrome.declarativeContent.

Начиная с версии 2022.10.25 для переключения на режим плейера и обратно используется кнопка на тулбаре и применяется API chrome.browserAction. При этом обработка функций API chrome.declarativeContent больше не требуется (удалена из кода и манифеста).

Интерфейсная часть самого аддона используется только для запуска выбранных в контекстном меню функций. Для этого, а также для доступа к настройкам аддона, применяется API chrome.contextMenus.

Для части внутренних функций и стартовой инициализации аддона используется API chrome.runtime.

Все остальные функции и возможности, включая интерфейс управления медиа-загрузчиком, содержатся в автоматически подгружаемом на страницы коде, запуск и работа которого регулируются API контент-скриптов.

Расширение работает полностью автономно. Настройки также автономны и сохраняются только в локальном хранилище самого аддона, синхронизации нет. Для работы с хранилищем применяется API chrome.storage. Запрос отдельного разрешения в манифесте при этом необязателен и не указан.

В версиях 2018*/2019* для обеспечения корректной работы контент-скриптов на страницах YouTube в манифесте для них запрашивались отдельные разрешения [ "*://www.youtube.com/watch?*v=*", "*://www.youtube.com/channel/*", "*://www.youtube.com/user/*", "*://www.youtube.com/embed/*" ].

В текущих версиях в манифесте для скриптов запрашивается разрешение [ "*://www.youtube.com/*""*://m.youtube.com/*" ].

Итоговая сводка запрашиваемых разрешений для текущих версий:


Дополнительные примечания по исходному коду

Практических ограничений по версии браузера не имеется, используемые API работают в версиях 29+. Однако, в связи текущими изменениями интерфейса сайта YouTube и применением неподдерживаемых в старых браузерах скриптов, настоятельно рекомендуется использовать версии не ниже 31+.

Исходный код предоставляется по принципу "как есть", он НЕ обфусцирован, исключительно с целью удобства при возможных самостоятельных доработках и для облегчения читаемости кода при его исследовании.

Исходный код текущей версии расширения можно просмотреть в режиме онлайн на любом из ресурсов, приведённых в материале YouTube Embedded RU : LBSC*.

* См.также: LBSC: Что это такое и как работать с этим архивом.


Модульная структура скриптов с разделением кода

В аддоне используется модульная схема, как основа для минимизации размера кода и общего повышения скорости его работы. Модульность применяется также для инжектируемых скриптов.

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

В связи с указанным подходом, в комплект аддона входят следующие файлы скриптов:

  • yteplus.js и ytvplus.js* – основной инжектор с функциями обработки и вызова других модулей;

    Запускаются всегда, при открытии страниц сайта YouTube, указаны как основные инжекторы в манифесте.

    В первом скрипте содержатся общие подготовительные операции и редиректоры, во втором – управление загрузчиком и обработкой контента страниц (зачистка "лишних" элементов, автостоп, отрисовка кнопки вызова загрузчика и т.д.).

    * С версии 2022.11.17 файлы скриптов инжектора объединены, оставлен один общий (yteplus.js). Причина: в текущих версиях аддона оба файла скриптов загружаются в любом случае. Объединение скриптов ускоряет загрузку и упрощает обработку общих переменных и функций. Функциональность инжектора в целом при этом не изменена.

  • ytembed.js – основной фоновый скрипт с функциями обработки запросов и загрузки модулей;

    Запускается всегда, автоматически выгружается из памяти, указан как основной фоновый скрипт в манифесте.

  • ytemenu.js – часть фонового скрипта, отвечающая за построение меню и переключение части настроек;

    Запускается только при вызове соответствующих функций, автоматически выгружается из памяти после их завершения.

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

  • yterare.js – часть фонового скрипта, отвечающая за редко востребованные задачи и настройки просмотра.

    Запускается только при вызове соответствующих функций, автоматически выгружается из памяти после их завершения.

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

    * Для обеспечения корректной работы расширения с куки читаем важное примечание по настройке браузера.

Кроме указанных "штатных" скриптов, в расширении используется опционально инжектируемый внешний* скрипт интерфейса управления загрузчиком.

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

Исходя из этого, автор считает более целесообразным загрузку (и последующее локальное сохранение) гарантированно работающего внешнего модуля, который обновляется и подстраивается под текущий дизайн и структуру сервиса.

Источник загрузки этого скрипта отличается для разных версий YouTube Embedded RU:

  • В версиях 2018*/2019* (начиная с 2018.6.2) использовался автономный скрипт загрузчика сервиса DetUrl.com.

    На текущий момент этот скрипт частично неработоспособен, он не отдаёт все доступные медиа-форматы для части роликов.

  • Начиная с версии 2022.10.25 внешний скрипт загрузки зависит от версии клиентского браузера.

    Для браузеров версий CR55+ загружается скрипт YouTube Links (оригинальный, непосредственно с сайта GreasyFork.org). Для более старых версий браузеров используется скрипт YouTube Media Direct (сжатая копия текущей версии).

    Различие связано с тем, что оригинальный скрипт "YouTube Links" содержит JS-операторы стандарта ES6, не работающие в браузерах версий старше CR55. Функционально результат работы обоих скриптов абсолютно одинаков, получаемые ссылки на медиа-файлы загружаются в любой версии браузера.

  • Начиная с версии 2022.11.17 добавлена возможность выбора и настройки внешнего скрипта загрузки.

    Теперь пользователь может выбрать скрипт опцией "Загрузчик YouTube Media Direct". Если она включена – в качестве загрузчика устанавливается скрипт "YouTube Media Direct", если выключена – оригинальный скрипт "YouTube Links".

    Как и в предыдущих версиях, выбор скрипта зависит от текущей версии браузера. В движках до CR55 эта опция включается автоматически и не может быть изменена, в этих браузерах применение загрузчика "YouTube Media Direct" устанавливается безусловно. В браузерах CR55+ опция по умолчанию выключена, но доступна для изменения.


Об использовании расширения в браузерах версий старше CR49

При использовании "YouTube Embedded RU" в браузерах достаточно старых версий возможна некорректная работа отдельных функций. Это не является ошибкой расширения и связано с ограничениями сайта YouTube (невозможность работы с ним в таких браузерах).

Подобная ситуация возможна при работе с любым браузером версии старше CR49. В частности, она наблюдается в браузерах SRWare Iron 29/31, где не поддерживаются форматы MP4, являющиеся на текущий момент основными в контенте YouTube. Соответственно, такие ролики не могут быть просмотрены в "раритетном" браузере (но могут быть загружены для запуска во внешнем медиа-плейере).

Кроме того, в достаточно старых браузерах не исключены и другие проблемы, связанные с применением современных технологий (скрипты, стили и т.д.). Это также не связано с ошибками в аддоне и зависит только от дизайнеров сайтов и их отказа от поддержки старых версий браузеров.

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

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

Поскольку достаточно простые решения подобной "кроссбраузерности" (по версиям движка) отсутствуют, автор считает нецелесообразным увеличение размера кода и изменение логики работы скриптов только ради поддержки достаточно старых браузеров (тем более – ради поддержки в них лишь части режимов).

Однако, при обоснованной потребности, полная поддержка всего функционала в "ретро-браузерах" может быть добавлена и для достаточно старых версий браузеров путём дополнительной доработки исходного кода. Доработка* выполняется на условиях частного партнёрства с конкретным заказчиком (по обоюдной договорённости).

* В этом случае возможен публичный выпуск и авторская поддержка "спецверсий" для старых браузеров. Такие релизы также могут быть размещены в разделе официальных загрузок этого сайта и в дальнейшем будут доступны всем "любителям старины". :)


Локализация интерфейса и перевод на другие языки

Язык интерфейса – только русский (локализация жёсткая, зашита в коде), добавление других* локализаций на текущий момент не планируется. Это связано со значительным упрощением кода, а также с тем, что при создании расширения автор в первую очередь ориентируется на русскоязычных пользователей.

* Впрочем, если "дело пойдёт", прикрутить ещё и "басурманский" не является особой проблемой…)

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

Тем не менее, при реальной необходимости полная поддержка иных локалей может быть добавлена и автором путём дополнительной доработки исходного кода. Эта доработка* может быть выполнена на условиях частного партнёрства с конкретным заказчиком (по обоюдной договорённости).

* В этом случае будет выполнен публичный выпуск с авторской поддержкой мультиязычных версий. Такие релизы также будут размещены в разделе официальных загрузок этого сайта и в дальнейшем будут доступны всем "любителям иностранщины". :)

Короче, велкам… :)


Благодарности, решпекты и пиво :)

Камраду FiLinX – за активную помощь в тестировании расширения и предложения по новым фичам.



Технические детали Бармалей
Бармалей 25.05.2018 19.11.2022 473 0.0

Общие технические сведения о разработке
Статус разработки:Активная, поддерживается автором
Язык интерфейса:Русский
Версия браузера:29+ (рекомендуется 31+)
Протестировано в:SRWare Iron 29/31/36/49 + 360 Extreme Explorer 9/11/12/13 (CR-63/69/78/86) + Chromium 87
Технологии и API:Чистый JavaScript (ES5), API: tabs, contextMenus, browserAction, pageAction, declarativeContent, commands, content-script

Поделиться

Всего комментариев: 0
close