YouTube Videolarını Otomatik Olarak Başlık ve Embed Koduna Dönüştürme

İçindekiler (3)

Bir YouTube kanalında biriken onlarca veya yüzlerce videoyu bir web sitesine, blog altyapısına ya da statik site jeneratörüne (Astro, Hugo, Publii, Jekyll) taşımak gerektiğinde en büyük operasyonel yük, her video için tek tek YouTube sayfasına gidip "Paylaş > Yerleştir" adımlarını tekrarlamaktır. Manuel olarak yürütülen bu süreç yalnızca zaman kaybına yol açmaz; iframe boyutlandırmalarında tutarsızlıklara, kopyalama hatalarına ve içerik yayınlama sürecinin tıkanmasına neden olur.

Bu sorunun kesin ve ölçeklenebilir çözümü, Google’ın sunduğu resmi YouTube Data API v3 altyapısını hafif bir Python otomasyonu (youtube_embed_cekici.py) ile birleştirmektir.

Neden Web Scraping Yerine YouTube Data API v3?

YouTube içeriklerini toplu olarak çekmek istendiğinde akla ilk gelen alternatifler genellikle yt-dlp veya doğrudan HTML kazıma (scraping) araçları olur. Ancak platformun bot tespit mekanizmaları son dönemde önemli ölçüde sıkılaşmıştır:

  • IP Kısıtlamaları ve CAPTCHA: Scraping araçları özellikle bulut sunucularda (VPS) veya yoğun ev ağı sorgularında 429 Too Many Requests veya "Sign in to confirm you're not a bot" engeline takılır.
  • Arayüz Değişiklikleri: Web sayfalarının DOM yapısı değiştiğinde kazıma scriptleri anında işlevsiz kalır.
  • Resmi Yetkilendirme Güvencesi: youtube_embed_cekici.py betiğinde kullanılan YouTube Data API v3, Google tarafından sağlanan resmi kapıdır. IP engeli riski sıfırdır, veri formatı standart JSON yapısıyla her zaman kararlıdır.
  • Cömert Ücretsiz Kota: Google Cloud, her geliştiriciye günlük 10.000 birim ücretsiz istek kotası sunar. 50 videoluk bir oynatma listesi sayfasını çekmek yalnızca 1 birim harcar. Kanalınızda bin video bulunsa dahi harcanan kota yalnızca 20 birimdir.

Betiğin Mimarisi ve Çalışma Mantığı

Kod
[Kanal ID] 
   └──> channels endpoint (contentDetails)
           └──> Uploads Playlist ID (UU...)
                   └──> playlistItems endpoint (Snippet, 50'şerli döngü)
                           └──> Başlık + İntro + Özel Boyutlu Iframe

1. Uploads Oynatma Listesini Tespit Etme

YouTube, bir kanala yüklenen tüm herkese açık videoları aslında gizli bir "Yüklenenler" (Uploads) oynatma listesinde tutar. Script, channels uç noktasını sorgulayarak kanalın UU... ile başlayan yükleme listesi kimliğini saniyeler içinde dinamik olarak belirler.

2. Sayfalama (Pagination) Yönetimi

YouTube API, tek sorguda en fazla 50 video döndürür. Script içinde yer alan while döngüsü, yanıttan dönen nextPageToken değerini otomatik takip ederek kanalınızda 10 video da olsa 500 video da olsa listenin sonuna kadar eksiksiz ilerler.

3. Dinamik Embed Kodlaması ve HTML Güvenliği

Betiğin en kritik işlevlerinden biri, ham video kimliğini (videoId) alıp doğrudan web standartlarına uygun bir HTML5 <iframe> şablonuna yerleştirmesidir. Özel genişlik ve yükseklik değerleri (örneğin 820x409 px, 16:9 oranı) doğrudan kod içinde üretilir. Ayrıca başlıklarda yer alabilecek tırnak ve özel karakterler html.escape filtresinden geçirilerek web sitenizde bozuk HTML oluşmasının önüne geçilir.

Karşılaştırma: Yöntemlerin Teknik Analizi

Kriter Manuel Kopyalama Scraping / yt-dlp YouTube Data API v3 (youtube_embed_cekici.py)
İşlem Süresi (50 Video) ~45-60 Dakika ~30-60 Saniye ~2 Saniye
IP Engeli / Bot Riski Yok Yüksek (Özellikle VPS/Cloud) Sıfır (Resmi Protokol)
Iframe Standartlaşması Hataya Açık Manuel regex gerektirir Tam Şablon Uyumu (Örn: 820x409)
Çıktı Formatı Yok Metin / JSON Doğrudan CSV veya Markdown (.md)

Kurulum ve Uygulama Adımları

Betiği kendi kanalınızda çalıştırmak için aşağıdaki adımları tamamlamanız yeterlidir:

  1. Google Cloud Üzerinde API Anahtarı Oluşturma: Google Cloud Console paneline giriş yapın. Yeni bir proje açarak kütüphaneden YouTube Data API v3 servisini etkinleştirin. Credentials (Kimlik Bilgileri) sekmesinden yeni bir API Key oluşturun.
  2. Kanal Kimliğini (Channel ID) Belirleme: YouTube Studio arayüzünde Özelleştirme > Temel Bilgiler adımlarını izleyin. UC... ile başlayan kanal kimliğinizi kopyalayarak koddaki CHANNEL_ID değişkenine yapıştırın.
  3. Gerekli Kütüphaneyi Yükleme ve Çalıştırma: Python ortamınızda HTTP isteklerini yönetmek için requests paketini kurun:
Kod
pip install requests

Kurulum tamamlanınca şu dosyayı youtube_embed_cekici.py olarak kaydedin:

Python

import csv
import html
import requests

# --- AYARLAR ---
API_KEY = "BURAYA_YOUTUBE_API_KEY_YAZIN"
CHANNEL_ID = "BURAYA_KANAL_ID_YAZIN"  # Örn: UC_x5XG1OV2P6uZZ5FSM9Ttw
OUTPUT_FILE = "videolar_ve_embed_kodlari.csv"


def get_uploads_playlist_id(channel_id, api_key):
    """Kanalın yüklenenler (uploads) oynatma listesi ID'sini alır."""
    url = "https://www.googleapis.com/youtube/v3/channels"
    params = {"part": "contentDetails", "id": channel_id, "key": api_key}
    response = requests.get(url, params=params).json()

    items = response.get("items", [])
    if not items:
        raise ValueError("Kanal bulunamadı veya geçersiz API anahtarı.")

    return items[0]["contentDetails"]["relatedPlaylists"]["uploads"]


def fetch_all_videos(playlist_id, api_key):
    """Oynatma listesindeki tüm herkese açık videoların başlık ve embed kodunu döner."""
    url = "https://www.googleapis.com/youtube/v3/playlistItems"
    videos = []
    next_page_token = None

    while True:
        params = {
            "part": "snippet",
            "playlistId": playlist_id,
            "maxResults": 50,
            "key": api_key,
            "pageToken": next_page_token,
        }
        res = requests.get(url, params=params).json()

        for item in res.get("items", []):
            snippet = item["snippet"]
            title = snippet["title"]
            video_id = snippet["resourceId"]["videoId"]

            # YouTube standart iframe embed şablonu
            embed_code = (
                f'<iframe width="560" height="315" '
                f'src="https://www.youtube.com/embed/{video_id}" '
                f'title="{html.escape(title)}" frameborder="0" '
                f'allow="accelerometer; autoplay; clipboard-write; encrypted-media; '
                f'gyroscope; picture-in-picture; web-share" '
                f"referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen></iframe>"
            )

            videos.append({"title": title, "embed_code": embed_code})

        next_page_token = res.get("nextPageToken")
        if not next_page_token:
            break

    return videos


def main():
    try:
        print("Kanal bilgileri sorgulanıyor...")
        uploads_id = get_uploads_playlist_id(CHANNEL_ID, API_KEY)

        print("Videolar ve embed kodları çekiliyor...")
        video_list = fetch_all_videos(uploads_id, API_KEY)

        with open(
            OUTPUT_FILE, mode="w", newline="", encoding="utf-8-sig"
        ) as file:
            writer = csv.DictWriter(file, fieldnames=["title", "embed_code"])
            writer.writeheader()
            writer.writerows(video_list)

        print(
            f"Tamamlandı! Toplam {len(video_list)} video '{OUTPUT_FILE}' dosyasına kaydedildi."
        )

    except Exception as e:
        print(f"Hata oluştu: {e}")


if __name__ == "__main__":
    main()

Daha sonra bu dosyayı python youtube_embed_cekici.py olarak çalıştırdığınız zaman, kanalınızdaki tüm videoların başlığı ve web sitenize doğrudan eklenmeye hazır iframe kodları Excel uyumlu UTF-8 formatında bir CSV dosyası olarak dışa aktarılır.

Dosyanın başındaki API_KEY = "BURAYA_YOUTUBE_API_KEY_YAZIN" ve CHANNEL_ID = "BURAYA_KANAL_ID_YAZIN" # Örn: UC_x5XG1OV2P6uZZ5FSM9Ttw kısımlarını kendinize göre düzenlemeyi unutmayın. Youtube API key'i Google Console'dan alabilirsiniz.

CMS, Markdown ve Headless Web Sitelerine Entegrasyon

Elde edilen veriler yalnızca tablo olarak saklanmakla kalmaz; modern web geliştirme süreçlerinde içerik motorlarına doğrudan girdi olarak beslenebilir.

Özellikle Markdown tabanlı statik site mimarilerinde (Publii, Astro, Hugo, Next.js Contentlayer) her satır bir .md dosyasına dönüştürülebilir. Üst kısımda YAML Frontmatter içinde başlık, açıklama ve etiketler yer alırken; gövde kısmında doğrudan betiğin ürettiği 560x315 boyutundaki iframe embed kodu konumlanır. Böylece kanalınızdaki tüm video arşivi, saatler süren manuel veri girişi yerine dakikalar içinde arama motorlarına ve kullanıcılara hazır bir video kütüphanesine dönüştürülmüş olur.

Tekrarlayan içerik operasyonlarında resmi API uç noktalarını hafif Python scriptleri ile otomatize etmek, veri kaybını önlerken projelerin teknik altyapısını hız ve güvenilirlik açısından modern web standartlarına taşır.

Yorumlar (0)

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Yorum Bırakın