Skip to content

Repository files navigation

Запис Meet → Drive

Мінімалістичне Chrome-розширення (Manifest V3): під час дзвінка в Google Meet з'являється кнопка ● Запис. Один клік → просте «Поділитися цією вкладкою?» → йде запис відео + звуку зустрічі + вашого мікрофона. Коли ви виходите з дзвінка — запис зупиняється сам і файл зберігається.

За замовчуванням файл падає у теку «Завантаження». Якщо налаштувати Google Drive (розділ нижче) — вивантажується одразу в Drive, з групуванням по теках: Meeting Recordings / РРРР-ММ-ДД / Meet <код> <дата> <час> — кожна зустріч у власній теці (відео + конспект разом), а ті — у теці дня.

Якщо додати Gemini API-ключ (розділ «Авто-конспект» нижче) — одразу після запису розширення робить структурований конспект українською і кладе його окремим Google Документом у ту саму теку.

Працює на безкоштовному @gmail.com. Записує навіть чужі дзвінки, де ви не організатор.


Як це влаштовано

Захоплення, запис і великі аплоади (Drive / заливання у Gemini) відбуваються в самій сторінці Meet (content script) — бо там уже є дозвіл на мікрофон, а головне: відео-файл не ганяється через sendMessage, а вантажиться fetch'ем прямо звідси. Service worker дає content script'у OAuth-токен (бо chrome.identity доступний лише там) і веде дрібну фонову обробку Gemini через chrome.alarms — незалежно від того, чи відкрита вкладка Meet.

Файл Роль
manifest.json Дозволи (identity, storage, downloads, alarms, offscreen, clipboardWrite), OAuth, реєстрація скриптів.
content.js / content.css Кнопка в Meet, детекція дзвінка, захоплення (getDisplayMedia + мікрофон), MediaRecorder, аплоад відео й аудіо-доріжки на Drive (або локально) і заливання аудіо в Gemini.
gdrive.js / gemini.js Чисті функції Drive / Gemini (приймають токен/ключ) — спільні для content script і service worker, без дублювання.
background.js OAuth-токен для content script, фоновий конспект через chrome.alarms (Files API → generateContent → Google Doc / .txt) з ретраями до дедлайну та перезаливкою аудіо з Drive; стан диктофона.
popup.html / popup.js Статус, кнопка диктофона 🎤 (запис → транскрипт у буфер), якість відео, Gemini-ключ, повноцінні логи.
offscreen.html / offscreen.js Невидимий документ розширення: тримає мікрофон диктофона, транскрибує через Gemini, копіює текст у буфер.
mic.html / mic.js Одноразовий запит дозволу мікрофона для диктофона.
icons/ Іконки (червона крапка).

Потік конспекту: клік «● Запис» → getDisplayMedia({preferCurrentTab}) + getUserMedia (мікрофон) → мікс аудіо → MediaRecorder (WebM) → на стоп content.js бере токен у background.js, вантажить відео на Drive (інакше локально), зберігає туди ж аудіо-доріжку, заливає аудіо в Gemini й передає background.js дрібну задачу — той по chrome.alarms чекає обробки і робить два кроки: (1) повний транскрипт спеціалізованою моделлю gemini-3.5-transcribe (Interactions API; запис довший за 1 год або порожня відповідь → запасний шлях через gemini-flash-latest із промптом дослівної розшифровки) → Google Документ «— транскрипт»; (2) конспект уже з цього тексту (gemini-flash-latest) → Google Документ «— конспект», тека перейменовується за темою. У теці зустрічі лишаються чотири файли: відео, аудіо, транскрипт, конспект. Якщо копія аудіо в Gemini протухла (~48 год) до транскрипту — сам перезаливає її з Drive.


Якість відео

Вартість кодування визначається пікселями за секунду, а не бітрейтом: 1080p30 удвічі дорожчий для CPU за 720p30, тоді як подвоєння бітрейта майже безкоштовне. Тому роздільність підбирається під машину, а бітрейт задається щедрий — саме він вирішує, чи буде читабельним дрібний текст на демонстрації екрана.

Профіль Роздільність Бітрейт Розмір Потрібно в бенчі
1080p висота ≤1080 5 Мбіт/с ≈2,2 ГБ/год ≥90 к/с
900p висота ≤900 3,5 Мбіт/с ≈1,6 ГБ/год ≥55 к/с
720p висота ≤720 2,5 Мбіт/с ≈1,1 ГБ/год

Авто (типово). Одразу після діалогу «Поділитися» розширення ~0,7 с ганяє реальний бенч кодера (WebCodecs, VP8 1080p: прогрів + медіана трьох прогонів — один короткий прогін дає розкид у 3× і не годиться) і бере найвищий профіль із запасом ~3× до потрібних 30 к/с. Міряється поточне навантаження машини, бо саме воно, а не залізо, вирішує, чи будуть ривки: на вільному профілі Intel UHD 630 без апаратного кодера дає ~95–130 к/с (→ 1080p), на завантаженому — 25–55 (→ 900p/720p). У попапі можна натомість зафіксувати профіль вручну.

Під час запису. Раз на 10 с перевіряється videoTrack.stats: якщо джерело почало викидати >12% кадрів (хтось навантажив CPU по ходу зустрічі), кадри/с знижуються 30 → 24 → 20 → 15, а після 3 хвилин без дропів повертаються назад. Роздільність при цьому не чіпається — зміна розміру всередині webm ламає перемотку в багатьох плеєрах. Усі рішення видно в логах попапа (Якість: …, Кадрів/с: 30 → 24 …).

Доріжці екрана ставиться contentHint = 'text' — підказка кодеру берегти різкі краї (текст, лінії) коштом плавності руху. Звук у відео пишеться на 128 кбіт/с.

Радикальне покращення — увімкнути апаратне кодування (chrome://gpu має показувати Video Encode: Hardware accelerated; на Linux — VAAPI). Тоді бенч одразу даватиме високі значення й 1080p30 писатиметься без навантаження на CPU.


Використання

  1. Зайдіть у дзвінок Google Meet.
  2. Натисніть ● Запис (внизу екрана) → у діалозі «Поділитися» (галочка звуку вкладки за потреби).
  3. На іконці розширення — бейдж REC.
  4. Завершіть дзвінок — запис зупиниться сам і збережеться. (Також можна натиснути ■ Зупинити запис на кнопці у вікні Meet.)
  5. Файл Meet <код> <дата>.webm — у теці «Завантаження» (або в Drive, якщо налаштовано).

(Опційно) Збереження одразу в Google Drive

Без цього файли зберігаються локально. Щоб писати прямо в Drive:

  1. chrome://extensions → увімкніть Режим розробникаЗавантажити розпаковане → ця тека. Скопіюйте ID розширення.
  2. console.cloud.google.com → створіть проєкт.
  3. APIs & Services → Library → увімкніть Google Drive API.
  4. OAuth consent screenExternal → назва, email; scope .../auth/drive.file; додайте себе в Test users.
  5. Credentials → OAuth client ID → тип Chrome Extension → вставте ID розширення → скопіюйте Client ID.
  6. У manifest.json замініть ВАШ_CLIENT_ID.apps.googleusercontent.com на свій Client ID → на картці розширення.

Після цього запис автоматично йтиме в Drive (папка «Meeting Recordings»), а якщо вивантаження не вдасться — все одно збережеться локально.


(Опційно) Авто-конспект через Gemini

Якщо вписати Gemini API-ключ — після кожного запису розширення надсилає відео в Gemini і отримує конспект українською (короткий підсумок, ключові тези, ухвалені рішення, завдання/дедлайни, відкриті питання). Конспект зберігається Google Документом «Meet … — конспект» у теці тієї ж зустрічі (поряд із відео; або локально .txt, якщо Drive недоступний).

Налаштування:

  1. aistudio.google.com/apikeyCreate API key (можна в тому ж проєкті, що й для Drive).
  2. Відкрийте popup розширення → вставте ключ у поле «Gemini API-ключ»«Зберегти ключ».

Приватність (важливо): на безкоштовному тарифі Gemini Google може використовувати надіслані аудіо/відео та відповіді для покращення своїх моделей. Для запису зустрічей, де можуть бути інші люди, це варто враховувати. Щоб цього уникнути — створіть ключ у проєкті з увімкненим білінгом (платний тариф) або використовуйте Vertex AI: на них дані для навчання не використовуються. Код розширення при цьому той самий — різниця лише в тарифі проєкту, у якому видано ключ.

Технічна примітка: надсилається саме відео (video/webm) з mediaResolution: LOW — бо MediaRecorder дає webm/opus, який Gemini не приймає як чисте аудіо. Відео заливається в Gemini Files API прямо з content script (де воно вже в пам'яті), а очікування обробки й генерацію конспекту веде service worker фоново через chrome.alarms, тож вкладку Meet можна закрити одразу. Низька роздільність кадрів тримає запит у межах лімітів навіть для довгих зустрічей.

Обмеження

  • Старт лише за кліком (Chrome не дозволяє почати захоплення без жесту користувача).
  • Діалог «Поділитися» показується щоразу — це вимога Chrome для запису екрана/вкладки.
  • Детекція кінця дзвінка спирається на URL/DOM Meet; за зміни верстки Google може знадобитися правка в content.js (на цей випадок є ручна зупинка).
  • Звук зустрічі пишеться лише якщо у вкладці реально щось звучить (інші учасники) і поставлено галочку «звук вкладки»; ваш голос іде з мікрофона.

Відмовостійкість (не втратити запис при обриві)

Під час запису шматки відео щосекунди пишуться на диск у IndexedDB (а не лише в пам'ять). Тож якщо вкладку чи браузер закрили, стався збій або вимкнулось світло — дані не зникають. При наступному відкритті Google Meet з'являється банер «Незавершений запис від …» з кнопками «Зберегти на Drive», «Завантажити» або відхилити. Збереження завжди дає один .webm-файл (журнал — лише проміжне сховище). При раптовому вимкненні живлення можна втратити щонайбільше останні ~1–2 секунди. Успішно збережені сесії видаляються з диску автоматично; покинуті прибираються через 7 днів.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages