Videos für YouTube-Kanäle abrufen

Ein Tool zur Suche und Auflistung von Videos eines YouTube-Kanals basierend auf dem Kanalnamen, einschließlich der Anzeige von Videodetails und direkten Links.

Installation der benötigten Pakete

In diesem Abschnitt installieren wir die benötigten Python-Pakete.

! pip install pytube youtube-transcript-api reportlab -q

Importieren der Bibliotheken

In diesem Abschnitt importieren wir die notwendigen Bibliotheken für die Transkript-Extraktion und PDF-Erstellung.

from pytube import YouTube, Playlist
from youtube_transcript_api import YouTubeTranscriptApi, TranscriptsDisabled, NoTranscriptFound
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
import os
import zipfile

Funktion zum Extrahieren des Transkripts

In diesem Abschnitt definieren wir eine Funktion, um Transkripte von YouTube-Videos basierend auf bevorzugten Sprachen zu extrahieren.

# Funktion zum Extrahieren des Transkripts
def get_transcript_with_language_preference(video_id, preferred_languages=("en", "de"), prefer_manual=True):
    """
    Extracts a transcript based on the preferred languages.
    If no transcript is found in the preferred languages, it checks available languages.
    
    Args:
        video_id (str): The ID of the YouTube video.
        preferred_languages (tuple): Preferred languages in order of priority.
        prefer_manual (bool): Whether to prefer manually created transcripts over auto-generated ones.
        
    Returns:
        str: The transcript or an error message if not found.
    """
    try:
        # Fetch the transcript list for the video
        transcript_list = YouTubeTranscriptApi.list_transcripts(video_id)
        
        # Filter transcripts for preferred languages and filter by manual or auto-generated type
        transcript = None
        for lang in preferred_languages:
            try:
                if prefer_manual:
                    transcript = transcript_list.find_transcript([lang])  # Prefer manually created transcripts
                else:
                    transcript = transcript_list.find_transcript([lang], filter_types=['generated'])  # Prefer auto-generated transcripts
                
                # If a valid transcript is found, break the loop
                if transcript:
                    break
            except Exception as e:
                # Continue if no transcript found for this language
                continue

        # If no transcript was found in the preferred languages, return available transcripts
        if not transcript:
            available_transcripts = transcript_list
            available_languages = {t.language_code: t.language for t in available_transcripts}
            
            error_message = f"Kein Transkript in den gewünschten Sprachen {preferred_languages} gefunden.\n"
            error_message += "Verfügbare Sprachen:\n"
            error_message += "\n".join([f"- {code} ({lang})" for code, lang in available_languages.items()])
            return error_message

        # Get the actual transcript text
        transcript_data = transcript.fetch()
        return "\n".join([entry["text"] for entry in transcript_data])

    except TranscriptsDisabled:
        return "Transkripte sind für dieses Video deaktiviert."
    except NoTranscriptFound:
        return "Es wurden keine Transkripte für dieses Video gefunden."
    except Exception as e:
        return f"Allgemeiner Fehler beim Abrufen des Transkripts: {e}"

Funktion zum Erstellen eines PDFs

In diesem Abschnitt definieren wir eine Funktion, um das extrahierte Transkript als PDF-Datei zu speichern.


# Funktion zum Erstellen eines PDFs
def save_transcript_as_pdf_with_pagination(title, transcript):
    """
    Speichert ein Transkript als PDF mit Seitenumbrüchen, wenn der Text zu lang ist.
    Args:
        title (str): Der Titel, der als Dateiname verwendet wird.
        transcript (str): Der Text des Transkripts.
    Returns:
        str: Der Name der gespeicherten PDF-Datei.
    """
    # Sicheren Dateinamen erstellen
    filename = f"{title}.pdf".replace("/", "_").replace("\\", "_")

    # PDF-Einstellungen
    c = canvas.Canvas(filename, pagesize=letter)
    width, height = letter

    # Schrift- und Layout-Einstellungen
    margin = 50
    line_height = 14
    max_lines_per_page = int((height - 2 * margin) / line_height) - 2  # Platz für Titel und Seitenrand

    # Titel schreiben
    c.setFont("Helvetica-Bold", 16)
    c.drawString(margin, height - margin, title)

    # Textblock initialisieren
    c.setFont("Helvetica", 12)
    y_position = height - margin - 30  # Platz für Titel

    # Text Zeile für Zeile schreiben
    lines = transcript.split("\n")
    line_count = 0

    for line in lines:
        if line_count >= max_lines_per_page:  # Neue Seite bei Bedarf
            c.showPage()
            c.setFont("Helvetica-Bold", 16)
            c.drawString(margin, height - margin, title)
            c.setFont("Helvetica", 12)
            y_position = height - margin - 30
            line_count = 0
        
        c.drawString(margin, y_position, line)
        y_position -= line_height
        line_count += 1

    # PDF speichern
    c.save()
    return filename

Eingabe der URLs

In diesem Abschnitt geben wir die URLs der YouTube-Videos oder -Playlists ein, deren Transkripte wir extrahieren möchten.

# Eingabe der URLs
urls = "https://www.youtube.com/playlist?list=PLfRDp3S7rLduqUTa6oXe_Zlv7bEeD06t6"

pdf_filenames = []  # Liste zur Speicherung der PDF-Dateinamen

# URL-Liste verarbeiten
url_list = urls.splitlines()
for url in url_list:
    url = url.strip()
    if not url:
        continue

    # Playlist-URL oder Video-URL?
    if "playlist" in url:
        playlist = Playlist(url)
        video_urls = playlist.video_urls
    else:
        video_urls = [url]

    for video_url in video_urls[:5]:
        try:
            yt = YouTube(video_url)
            video_id = yt.video_id
            title = video_id
            print(f"Verarbeite Video: {title}")

            transcript = get_transcript_with_language_preference(video_id)

            # Speichern des Transkripts als PDF
            pdf_filename = save_transcript_as_pdf_with_pagination(title, transcript)
            pdf_filenames.append(pdf_filename)
            print(f"Transkript für '{title}' gespeichert als {pdf_filename}.")

        except Exception as e:
            print(f"Fehler bei der Verarbeitung von {video_url}: {e}")

Erstellen eines ZIP-Archivs

In diesem Abschnitt erstellen wir ein ZIP-Archiv, das alle generierten PDF-Dateien enthält.


# Erstellen eines ZIP-Archivs
zip_filename = "transcripts.zip"
with zipfile.ZipFile(zip_filename, 'w') as zipf:
    for pdf_filename in pdf_filenames:
        zipf.write(pdf_filename)
        os.remove(pdf_filename)  # Lösche die PDF-Dateien nach dem Hinzufügen zum ZIP-Archiv

print(f"ZIP-Archiv '{zip_filename}' wurde erstellt.")

Löschen der ZIP-Datei

In diesem Abschnitt löschen wir die ZIP-Datei, falls sie nicht mehr benötigt wird.

# os.remove(zip_filename)

Fazit

In diesem Notebook haben wir gelernt, wie man YouTube-Transkripte extrahiert und als PDF-Dateien speichert. Wir haben die notwendigen Pakete installiert, Funktionen zur Transkript-Extraktion und PDF-Erstellung definiert, und schließlich die Transkripte von YouTube-Videos in einem ZIP-Archiv zusammengefasst. Diese Schritte ermöglichen eine effiziente Analyse und Speicherung von YouTube-Inhalten.