Alternatif olarak pip install yt-dlp ile ytdl python paketini kurduktan sonra şunu da kullanabilirsiniz,
best en iyi kaliteyi, worst en düşük dosya boyutunu veya diğer kaliteleri seçebilirsiniz.

import os
from yt_dlp import YoutubeDL

def get_user_inputs():
    # Kullanıcıdan gerekli bilgileri al
    txt_path = input("Lütfen YouTube linklerinin bulunduğu txt dosyasının yolunu girin: ")
    download_path = input("Videoların kaydedileceği klasör yolunu girin: ")
    quality = input("Video kalitesini seçin (best/worst/1080p/720p/480p/360p): ")
    
    return txt_path, download_path, quality

def create_download_directory(path):
    # İndirme klasörü yoksa oluştur
    if not os.path.exists(path):
        os.makedirs(path)
        print(f"'{path}' klasörü oluşturuldu.")

def read_urls(file_path):
    # txt dosyasından linkleri oku
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            # Boş satırları ve whitespace'leri temizle
            urls = [line.strip() for line in file if line.strip()]
        return urls
    except FileNotFoundError:
        print(f"Hata: '{file_path}' dosyası bulunamadı.")
        return []
    except Exception as e:
        print(f"Dosya okuma hatası: {str(e)}")
        return []

def download_videos(urls, download_path, quality):
    # Video kalitesi ayarlarını belirle
    quality_settings = {
        'best': 'bestvideo+bestaudio/best',
        'worst': 'worstvideo+worstaudio/worst',
        '1080p': 'bestvideo[height<=1080]+bestaudio/best[height<=1080]',
        '720p': 'bestvideo[height<=720]+bestaudio/best[height<=720]',
        '480p': 'bestvideo[height<=480]+bestaudio/best[height<=480]',
        '360p': 'bestvideo[height<=360]+bestaudio/best[height<=360]'
    }
    
    format_spec = quality_settings.get(quality.lower(), 'best')

    # yt-dlp ayarları
    ydl_opts = {
        'format': format_spec,
        'outtmpl': os.path.join(download_path, '%(title)s.%(ext)s'),
        'ignoreerrors': True,  # Hatalı linklerden sonra devam et
        'no_warnings': False,
        'progress_hooks': [lambda d: print(f"İndiriliyor: {d['filename']}")],
    }

    # Videoları indir
    with YoutubeDL(ydl_opts) as ydl:
        for url in urls:
            try:
                print(f"\nVideo indiriliyor: {url}")
                ydl.download([url])
            except Exception as e:
                print(f"Hata oluştu ({url}): {str(e)}")

def main():
    print("YouTube Video İndirme Programı")
    print("-" * 30)
    
    # Kullanıcı girdilerini al
    txt_path, download_path, quality = get_user_inputs()
    
    # İndirme klasörünü oluştur
    create_download_directory(download_path)
    
    # Linkleri oku
    urls = read_urls(txt_path)
    if not urls:
        print("İndirilecek link bulunamadı.")
        return
    
    print(f"\nToplam {len(urls)} video indirilecek.")
    
    # İndirme işlemini başlat
    download_videos(urls, download_path, quality)
    
    print("\nİndirme işlemi tamamlandı!")

if __name__ == "__main__":
    main()