Dynamic import() of extension modules from a content script makes Chrome log 'Unsafe attempt to load URL chrome-extension://...' on YouTube pages, which fills the extension's error list even though the modules load (HTTP 200). The content script is now one classic file built by 'npm run build'; web_accessible_resources is no longer needed and is removed. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
3.9 KiB
Outlier Saver
Расширение для Chrome (личное): пока вы смотрите YouTube с установленным VidIQ, оно читает карточки видео и сохраняет те, у которых высокий outlier score. Данные можно выгрузить в JSON или CSV.
Установка
- Откройте
chrome://extensionsи включите «Режим разработчика». - «Загрузить распакованное расширение» → выберите эту папку.
- Откройте YouTube (VidIQ должен быть включён) и пролистайте ленту, поиск или страницу канала.
Как это работает
- Расширение ничего не скачивает и не использует API: оно читает то, что уже нарисовано на странице.
- Со страницы берутся название, ссылка, превью, канал и просмотры; у VidIQ — outlier score и число подписчиков. Просмотры и подписчики те же, что на экране (например, «59 млн»), поэтому округлены.
- Видео сохраняется, если
outlier score ≥ порогаипросмотры ≥ минимума(по умолчанию 5 и 10 000, меняются в настройках). Уже сохранённое видео обновляется при каждой встрече. - Данные лежат в IndexedDB браузера. Кнопки «Скачать JSON» и «Скачать CSV» в popup выгружают всё сохранённое.
- Поддерживаются русский и английский интерфейс YouTube. Собираются карточки на главной, в поиске, в боковой панели просмотра и на страницах каналов; само открытое видео не собирается.
Если ничего не сохраняется
- Убедитесь, что VidIQ показывает на карточках outlier score и подписчиков.
- Понизьте порог или минимум просмотров в настройках.
- Если YouTube или VidIQ изменили разметку, запустите
npm test: тестcard.domразберёт образцы карточек в Chrome и покажет, что именно не читается. Настоящий образец с главной лежит вtest/fixtures/home-card.html; чтобы обновить его, скопируйте HTML новой карточки (правый клик → «Просмотреть код» → Copy outerHTML) и поправьте ожидаемые значения вtest/card.dom.test.js.
Разработка
Зависимостей нет, сборка только одна (content script, см. ниже). Тесты (Node 22; тест разбора карточки запускает headless Chrome и пропускается, если Chrome не найден):
npm test
Content script собирается в один файл: после правки src/content/main.js или модулей из src/lib/, которые он использует (card, numbers, vidiq, video-id), выполните
npm run build
Собранный src/content.js лежит в репозитории, тест bundle падает, если он отстал от исходников. Динамический import() в content script не используется: Chrome оставляет из-за него ошибки в chrome://extensions.
После изменения кода нажмите «Обновить» у расширения на chrome://extensions.