Skip to content

Repository files navigation

BulkYT_2md_2NotebookLM

📺 YT_2md_2NotebookLM — Bulk Import YouTube Video → into Structured Markdown with transcript, description, sorted by date as sources of NotebookLM

Generate Markdown Content from YouTube Channels: Bulk Auto-import transcripts and descriptions and auto-naming .md-files with creation date, channel name as file titles

Перетворює список YouTube-посилань на впорядковану бібліотеку .md файлів, зі структурою, зручною для ШІ. Кожен файл - автоматично наповнюється транскрипцією та описом відео, зберігається під назвою, що містить дату публікації, автора та назву відео - для легкої навігації та прочитання в Google NotebookLM.

Python 3.8+ yt-dlp License: MIT Platform


🎯 Навіщо це потрібно

"Коли я хочу додати в NotebookLM десятки відео з YouTube, я використовую цей скрипт, щоб масово імпортувати їхні транскрипти з описом, тегами та ыншими структурованими даними. Всі вони зберігаються у файли markdown .md з автоматично доданою в назву датою публікації відео та ім'ям автора."

Ситуація: У вас є список важливих YouTube-відео — лекції, інтерв'ю, подкасти — і ви хочете занурити їх у свій робочий простір у NotebookLM, Obsidian або будь-якій PKM-системі.

Проблема: Копіювати транскрипти вручну, шукати дату публікації, форматувати текст — це рутинна робота для ші-агента. Аналізувати ідеї — це робота для людини.
Цей скрипт повертає вам ваш час.

Результат: Кожне відео → окремий .md файл із повною структурою: метадані, опис, транскрипт і заготовки для ваших нотаток — все готово до завантаження в NotebookLM як джерело (Source). А в заголовок кожного - автоматично додається дата створення відео та назва каналу.


🚀 Чому це змінить ваш робочий процес

Функція Що це дає вам
📦 Zero-Effort Bulk Processing Додайте 50+ посилань у текстовий файл — отримайте готову базу знань за хвилини, поки п'єте каву
📂 Chronological Intelligence Файли іменуються YYYY-MM-DD_ Channel_ Title — бібліотека сортується сама, утворюючи чітку часову лінію
🧠 AI-Optimized Content Скрипт "лікує" розірвані рядки транскрипту, створюючи монолітні абзаци, які AI розуміє значно глибше
🏗️ Professional Template Кожен файл: Метадані → Опис → Транскрипт → Місце для нотаток. Готово до роботи "з коробки"
🌍 Polyglot Support Інтелектуальний пошук субтитрів: UA → RU → EN з автоматичним перекладом
🛡️ Anti-Block Protection Підтримка cookies.txt для обходу помилки "Too Many Requests" (429)
🧹 Auto-Sanitization Скрипт очищує список оброблених посилань — жодного дублювання роботи

⚙️ Технічні вимоги

  • Python: 3.8 або новіший
  • pip (входить до стандартної установки Python)
  • Deno: deno.land (необхідний для розв'язання JavaScript-завдань YouTube)
  • FFmpeg: ffmpeg.org (необхідний для стабільної роботи yt-dlp з медіа-даними)

📦 Встановлення

1. Клонувати або завантажити репозиторій

git clone https://github.com/YOUR_USERNAME/yt2notebooklm.git
cd yt2notebooklm

Або просто завантажте файл yt_links_to_titles_with_dates_for_notebooklm.py вручну.

pip install yt-dlp requests

3. Встановити системні інструменти (Windows)

Для обходу сучасного захисту YouTube («n-challenge») скрипту потрібен Deno та FFmpeg. Виконайте в PowerShell:

# Встановлення Deno
winget install --id DenoLand.Deno -e --source winget

# Встановлення FFmpeg
winget install --id Gyan.FFmpeg -e --source winget

Важливо: Після встановлення перезапустіть термінал або Cursor, щоб зміни набрали чинності.

3. Налаштувати шляхи у скрипті

Відкрийте файл скрипта і знайдіть розділ # --- НАЛАШТУВАННЯ --- в кінці файлу:

# --- НАЛАШТУВАННЯ ---
input_file  = r"D:\YOUR_PATH\links_to_process.txt"   # файл з посиланнями
output_folder = r"D:\YOUR_PATH\My_NotebookLM"      # папка для збереження .md
cookie_file = r"D:\YOUR_PATH\youtube_cookies.txt"  # (опційно) файл кук для обходу блокувань

Замініть шляхи на свої. Папка для виводу буде створена автоматично, якщо не існує.


📂 Структура проекту

your-folder/
├── yt_links_to_titles_with_dates_for_notebooklm.py   # основний скрипт
├── links_to_process.txt                               # сюди вставляєте YouTube URL
├── README.md
│
└── My_NotebookLM/                                  # папка з результатами (генерується)
    ├── 2024-11-15_ ChannelName_ Video Title.md
    ├── 2025-03-01_ AnotherChannel_ Another Video.md
    └── ...

▶️ Запуск скрипта

Скрипт можна запустити в будь-якому зручному середовищі:

Terminal / PowerShell (Windows)

python yt_links_to_md_transcript_with_dates.py

macOS / Linux Terminal

python3 yt_links_to_md_transcript_with_dates.py

IDE (VS Code, Cursor, PyCharm)

  • Відкрийте файл скрипта
  • Натисніть кнопку ▶ Run у верхньому правому куті
  • Або викличте вбудований термінал (Ctrl+`` ) і виконайте команду вище

Jupyter Notebook / Google Colab

%run yt_links_to_titles_with_dates_for_notebooklm.py

⚠️ У Colab потрібно спочатку завантажити links_to_process.txt і встановити бібліотеки через !pip install yt-dlp youtube-transcript-api


📋 Як користуватися (покрокова інструкція)

Крок 1. Відкрийте файл links_to_process.txt і вставте посилання на відео — по одному на рядок:

https://www.youtube.com/watch?v=dQw4w9WgXcQ
https://youtu.be/abc123def456
https://www.youtube.com/watch?v=xyz789

Крок 2. Запустіть скрипт одним зі способів вище.

Крок 3. Спостерігайте за прогресом у консолі:

[START] Обробка 3 відео (включаючи авто-субтитри)...
[1/3] Обробка: https://www.youtube.com/watch?v=dQw4w9WgXcQ
      - Канал: Rick Astley
      - Назва: Never Gonna Give You Up
      [DONE] Збережено: 1987-10-25_ Rick Astley_ Never Gonna Give You Up.md
...
--- ПІДСУМОК ---
Успішно оброблено: 3
Не вдалося: 0

Крок 4. Завантажте згенеровані .md файли у Google NotebookLM як джерела (Sources → Upload).


🛡️ Обхід блокувань (Error 429 & Cookies)

Проблема: YouTube часто блокує автоматизовані запити (особливо при інтенсивному використанні), видаючи помилку HTTP Error 429: Too Many Requests.

Рішення: Скрипт підтримує авторизацію через Cookies. Це дозволяє скрипту виглядати для YouTube як звичайний сеанс браузера.

Як налаштувати:

  1. Встановіть розширення для браузера (наприклад, Get cookies.txt LOCALLY).
  2. Зайдіть на YouTube під своїм акаунтом.
  3. Експортуйте куки: натисніть на розширення і збережіть файл під назвою youtube_cookies.txt.
  4. Розмістіть файл у папці зі скриптом (або вкажіть шлях у налаштуваннях).

Tip

Це не обов'язково. Скрипт працюватиме анонімно, якщо файлу немає. Використовуйте куки, тільки якщо бачите помилку 429 або якщо відео має вікові обмеження.


📄 Структура згенерованого файлу

Кожен .md файл містить такі розділи:

# 2025-03-15_ ChannelName_ Video Title

---
URL: https://youtube.com/...
tags:
about:
date: 2025-03-15
---

**TITLE**:
## Повна назва відео                    ← авто

**URL**:
https://youtube.com/...                 ← авто

**HOOK**:
                                        ← для вашого рукописного хуку

**DESCRIPTION**:
(опис під відео з YouTube)             ← авто

=====

**TIMESTAMPS**:
                                        ← вручну або з відео

=====

**BRIEF/SUMMARY**:
##
                                        ← ваш короткий конспект

=====

**TRANSCRIPT**:
(повний текст субтитрів)               ← авто

=====

**BEST COMMENTS**:
                                        ← вручну

-------------------------------------------

**TRANSCRIPT WITH TIMESTAMPS**:
                                        ← вручну, для створення timestamps чи часових міток для відсилань, зносок в нотатках NotebookLM

-------------------------------------------

# \дата_ [#тег] СУПРОВІДНА СТАТТЯ - тема/

**URL**:                                ← вручну (якщо є супровідна стаття/пост)
**TITLE**: ##
**HOOK/TAGS**:
**DESCRIPTION**:
**TEXT**:

##  МІЙ опис суті, МОЇ НОТАТКИ/SUMMARY

-------------------------------------------
Секція Заповнення
TITLE, URL, DESCRIPTION, TRANSCRIPT ✅ Автоматично (yt-dlp + субтитри)
date, channel у front-matter ✅ Автоматично
tags, about ✏️ Вручну
HOOK, TIMESTAMPS, BRIEF/SUMMARY ✏️ Вручну
BEST COMMENTS, TRANSCRIPT WITH TIMESTAMPS ✏️ Вручну
СУПРОВІДНА СТАТТЯ ✏️ Вручну

🧠 Логіка пошуку субтитрів

1. Ручні субтитри: UA → RU → EN
        ↓ не знайдено
2. Авто-субтитри: UA → RU → EN
        ↓ не знайдено
3. Переклад будь-якої доступної доріжки на UA
        ↓ недоступно
4. Будь-яка доступна доріжка без перекладу
        ↓ нічого немає
5. [ERROR] — файл не створюється, URL залишається у списку

При тимчасових мережевих помилках (IpBlocked, RequestBlocked) скрипт автоматично робить до 4 спроб з паузами.


❓ Часті питання (FAQ)

Q: Я отримую Error 429: Too Many Requests. Що це?
A: YouTube тимчасово обмежив запити з вашої IP-адреси. Це часто трапляється при обробці великої кількості відео.

  • Рішення 1: Використовуйте Cookies (див. розділ вище).
  • Рішення 2: Зачекайте 1 годину. YouTube зазвичай автоматично знімає блокування після періоду спокою.
  • Рішення 3: Скрипт автоматично використовує Safe Mode (паузи 12-28с), не вимикайте його.

Q: Я отримав [ERROR] Субтитри недоступні. Що це означає?
A: У цього відео повністю вимкнені субтитри (включаючи авто-генерацію). Файл не буде створено, а URL залишиться у links_to_process.txt для повторної спроби.

Q: Чи підтримуються плейлисти або канали цілком?
A: Наразі скрипт обробляє лише окремі URL. Підтримку плейлистів заплановано.

Q: Як завантажити файли в NotebookLM?
A: Відкрийте notebooklm.google.com → створіть або відкрийте Notebook → Sources → + Add source → Upload → виберіть .md файли.

Q: Чи безпечно вставляти пасти з Google Drive у input_file?
A: Так, шлях до Google Drive (наприклад, D:\G.DRIVE\...) працює як звичайна папка, якщо Drive синхронізовано.

Q: Скрипт не знаходить python у PowerShell.
A: Спробуйте py, python3 або переконайтеся, що Python додано до PATH під час встановлення (галочка "Add Python to PATH" в інсталяторі).

Q: Чи підтримуються Shorts?
A: YouTube Shorts підтримуються — вони є звичайними відео з коротким URL. Однак у більшості Shorts субтитри недоступні.


⚠️ Відомі обмеження

  • Якщо YouTube тимчасово блокує IP (наприклад, із VPN або хмарних серверів), буде помилка IpBlocked. Зачекайте кілька хвилин і запустіть знову.
  • Скрипт не підтримує відео з обмеженим доступом (вікові обмеження, приватні відео, відео тільки для підписників).
  • ffmpeg не потрібен — скрипт не завантажує медіафайли.

🗺️ Плани на майбутнє (Roadmap)

  • Підтримка URL плейлистів і каналів
  • Опція вибору мови пошуку субтитрів через аргументи CLI
  • Генерація BRIEF/SUMMARY через Gemini / OpenAI API
  • Підтримка виводу у форматах .txt та .json
  • Docker-контейнер для запуску без налаштування середовища

🤝 Внесок у проект

Pull requests вітаються! Для великих змін, будь ласка, спочатку відкрийте Issue, щоб обговорити запропонований напрям.

  1. Fork репозиторію
  2. Створіть гілку (git checkout -b feature/my-feature)
  3. Зробіть commit (git commit -m 'Add my feature')
  4. Push у гілку (git push origin feature/my-feature)
  5. Відкрийте Pull Request

📜 Ліцензія

Цей проект розповсюджується під ліцензією MIT. Використовуйте, модифікуйте та ділітеся вільно — з посиланням на оригінал.


Зроблено з ☕ і бажанням витрачати час на ідеї, а не на рутину.
Якщо скрипт зекономив вам час — ⭐ зірочка на GitHub буде найкращою подякою.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages