YouTube-Kanal mit VB.NET verwalten, Teil 2

Im ersten Teil dieser Artikelreihe haben wir die Vorbereitungen auf der Seite von Google beziehungsweise YouTube erledigt. Dabei haben wir ein Google-Konto angelegt, dieses zum Entwickler-Konto erweitert und eine Anwendung für den Zugriff auf die YouTube-API registriert. Außerdem haben wir dort die für den Zugriff notwendigen Zugangsdaten erstellt, die wir in der nun zu programmierenden .NET-Lösung verwenden können. In der .NET-Lösung wollen wir verschiedene Informationen zu unserem YouTube-Kanal abrufen wie die Namen der Playlisten und Informationen zu den enthaltenen Videos. Außerdem wollen wir neue Videos anlegen und die Eigenschaften der vorhandenen Videos anpassen.

Die Ausgangsidee zu diesem Artikel war, dass ich einen YouTube-Kanal eröffnet habe und dort Access-Videos veröffentliche. Die Herausforderung dabei ist, dass ich beispielsweise im Beschreibungstext gern Links zu anderen, thematisch ähnlichen Videos hinzufügen würde und auch Links zu entsprechenden Artikeln aus meinen Magazinen. Das Problem dabei ist, dass es immer mehr Videos werden und Artikel gibt es ohnehin schon weit über 1.000 Stück. Außerdem sollen die Beschreibungstexte auch noch Links zu eventuell verfügbaren Beispieldatenbanken enthalten.

Aufwendige Pflege

Dies alles zu pflegen, indem man die Beschreibungstexte von Hand zusammenschreibt und einzeln über YouTube Studio hinzuzufügen, wäre sehr zeitintensiv und deshalb suchen wir einen alternativen Weg. Dieser sieht so aus, dass wir die notwendigen Daten lokal in einer Access-Datenbank speichern, wo sich die Informationen über YouTube-Videos, Artikel und ihre Verknüpfungen befinden. Diese sollen dann per Code zu Beschreibungstexten zusammengestellt und den Videos im YouTube-Kanal hinzugefügt werden.

Datenbankzugriff im zweiten Schritt

Den Schritt, die Daten aus der Datenbank zu beziehen, lassen wir vorerst aus – zunächst einmal wollen wir überhaupt in der Lage sein, auf die Videos des Kanals zuzugreifen, deren Daten auszulesen und Informationen wie den Titel oder den Beschreibungstext und gegebenenfalls auch weitere Eigenschaften zu aktualisieren.

Verwendete Technik

Dass wir die Lösung mit Visual Basic .NET entwickeln wollen, haben wir bereits im ersten Teil der Artikelreihe erläutert. Es gibt alle notwendigen Bibliotheken für den Zugriff auf die YouTube Data API v3 und wir können von einer .NET-Anwendung auch auf die Daten einer Access-Datenbank zugreifen.

Gegebenenfalls ist letzteres aber auch gar nicht notwendig – wir könnten auch eine DLL programmieren, die wir in das VBA-Projekt einer Access-Datenbank einbinden. Von dort können wir dann die Methoden und Eigenschaften dieser DLL nutzen und innerhalb der Access-Datenbank die darüber zu schreibenden Daten aus den Tabellen lesen.

Welcher Projekttyp

Deshalb stellt sich die Frage, mit welchem Projekttyp wir starten. Auch wenn wir die Funktionen später in einer .NET-DLL veröffentlichen wollen, entscheiden wir uns an dieser Stelle für eine WPF-Anwendung. Den Zugriff auf die Access-Datenbank mit den Daten für die YouTube-Videos wollen wir zunächst aussparen und stattdessen erst einmal den Zugriff auf die Daten des YouTube-Kanals realisieren sowie einige Beispieldaten in bestehende YouTube-Videos schreiben.

Projekt erstellen und Pakete hinzufügen

Im ersten Ansatz und zum Experimentieren erstellen wir ein neues Projekt des Typs WPF-Anwendung für Visual Basic. In diesem Fall haben wir die Variante für .NET Core verwendet. Außerdem benötigen wir zwei NuGet-Pakete. Um diese hinzuzufügen, öffnen wir mit dem Menübefehl Projekt|NuGet-Pakete verwalten… das NuGet-Fenster.

Hier wechseln wir zum Bereich Durchsuchen und Suchen nacheinander nach den folgenden NuGet-Paketen und installieren diese jeweils mit einem Klick auf Installieren:

  • Google.Apis.Oauth2.v2: Ermöglicht die Authentifizierung für den Zugriff auf die YouTube-Daten
  • Google.Apis.YouTube.V3: Ermöglicht den Zugriff auf die YouTube-Daten.

Wenn wir nach der Installation zum Bereich Installiert wechseln, sollte dieser wie in Bild 1 aussehen.

Die für die Lösung benötigten NuGet-Pakete

Bild 1: Die für die Lösung benötigten NuGet-Pakete

Programmierung der Authentifizierung

Ziel der nachfolgend beschriebenen Authentifizierung ist es, ein Objekt des Typs YouTubeService zu erhalten, mit dem wir auf die Daten des YouTube-Kanals des Benutzers zugreifen können, in dessen Kontext wir uns anmelden. Diese Klasse (siehe Listing 1) bezeichnen wir mit Authentication und sie enthält nur eine Funktion namens AuthenticateOAuth. Diese Funktion liefert nach erfolgreicher Authentifizierung das gewünschte YouTubeService-Objekt zurück.

Imports System.IO
Imports System.Threading
Imports Google.Apis.Auth.OAuth2
Imports Google.Apis.Services
Imports Google.Apis.YouTube.v3
Public Class Authentication
     Public Shared Function AuthenticateOAuth() As YouTubeService
         Dim objYouTubeService As Google.Apis.YouTube.v3.YouTubeService
         Dim objUserCredential As UserCredential
         Dim objStream As FileStream
         objStream = New FileStream("client_secrets.json", FileMode.Open, FileAccess.Read)
         objUserCredential = GoogleWebAuthorizationBroker.AuthorizeAsync(
             GoogleClientSecrets.FromStream(objStream).Secrets,
             {YouTubeService.Scope.Youtube},
             "user",
             CancellationToken.None).Result
         objYouTubeService = New YouTubeService(New BaseClientService.Initializer() With {
             .HttpClientInitializer = objUserCredential
         })
         Return objYouTubeService
     End Function
End Class

Listing 1: Klasse zur Authentifizierung eines Google-Accounts

Die Frage ist nur: Woher bekommen wir die für die Authentifizierung notwendigen Daten Dazu gehören zwei verschiedene Sätze von Informationen:

  • Die Daten für die App, mit der wir uns anmelden wollen und
  • die Daten für den Benutzer, in dessen Kontext die Anmeldung erfolgen soll.

Die Daten für die App haben wir im ersten Teil der Artikelreihe mit dem Titel YouTube-Kanal mit VB.NET verwalten, Teil 1 (www.vbentwickler.de/315) von unserem Google-Entwicklerkonto als JSON-Datei heruntergeladen und unter dem Namen client_secrets.json gespeichert. Den zweiten Satz von Daten, die Daten des Benutzers, geben wir bei der eigentlichen Authentifizierung an. Zunächst benötigen wir nur die Daten aus der Datei client_secrets.json. Der Einfachheit halber platzieren wir diese in dem Verzeichnis, in dem beim Debuggen der Anwendung auch die dabei erstellte .exe-Datei landet. Dabei handelt es sich um den Ordner \bin\Debug\net5.0-windows unterhalb unseres Projektordners.

Die Funktion AuthenticateOAuth liest diese Datei in ein FileStream-Objekt ein und übergibt die enthaltenen Daten als ersten Parameter der AuthorizeAsync-Methode der Klasse GoogleWebAuthroizationBroker. Daneben werden weitere Parameter übergeben. Der zweite lautet {YouTubeService.Scope.Youtube} und legt fest, auf welchen Bereich sich die Authentifizierung bezieht. Danach erstellen wir ein neues Objekt des Typs YouTubeService und übergeben diesem das UserCredential-Objekt als Initialisierer. Danach gibt die Funktion das neue YouTubeService-Objekt als Ergebnis zurück.

Alle vorhandenen Videos auflisten

Als ersten Anwendungsfall wollen wir alle Videos eines Kanals ermitteln. Der Seite MainWindow.xaml fügen wir dazu eine Schaltfläche wie die folgende hinzu:

<Button x:Name="btnAlleVideos" Click="btnAlleVideos_Click">Alle Videos</Button>

In der dadurch aufgerufenen Prozedur wollen wir eine Liste von Video-Elementen mit den wichtigsten Eigenschaften eines Videos füllen. Um diese Eigenschaften zu erfassen, wollen wir eine entsprechende Klasse verwenden.

Diese Klasse fügen wir hinzu, indem wir im Projektmappen-Explorer mit der rechten Maustaste auf den Namen des Projekts klicken (in diesem Fall YouTubeAPIV3) und dann den Kontextmenüeintrag Hinzufügen|Klasse… betätigen. Im folgenden Dialog geben wir einfach den Namen der Klasse an, in diesem Fall MyVideo.vb, und klicken dann auf Hinzufügen.

Anschließend füllen wir die Klasse mit dem folgenden Code:

Public Class MyVideo
     Public Property ID As String
     Public Property Title As String
     Public Property Description As String
     Public Property Thumbnail As String
     Public Property PublishedAt As Date
End Class

Wer bisher Klassen nur mit VBA oder VB6 programmiert hat: Unter VB.NET ist die explizite Angabe von Property Get-/Let-/Set-Prozeduren nicht notwendig, die hier vorliegende abkürzende Definition reicht für schreib- und lesbare Eigenschaften aus.

Mit der oben definierten Schaltfläche lösen wir eine Prozedur aus, die ein List-Objekt zum Aufnehmen der Videos erstellt. Den Typ der aufzunehmenden Elemente geben wir in Klammern an (Of MyVideo). Damit rufen wir eine Funktion namens GetAllVideos auf. Dieser übergeben wir die ID des Kanals, den wir untersuchen wollen. Wo bekommen wir den her Dazu rufen wir die folgende Seite im Browser auf:

https://www.youtube.com/account_advanced

Die Kanal-ID befindet sich dort unter der Nutzer-ID. (siehe Bild 2) Für den Standardkanal können wir die ID auch aus den Buchstaben UC und der Nutzer-ID zusammensetzen.

Abfragen der Kanal-ID

Bild 2: Abfragen der Kanal-ID

Nach dem Aufruf der Funktion GetAllVideos ist die Liste objVideos gefüllt und wir können diese über die Laufvariable objVideo in einer For Each-Schleife durchlaufen und ihre Eigenschaften ausgeben:

Private Sub btnAlleVideos_Click(sender As Object, e As RoutedEventArgs)
     Dim objVideos As List(Of MyVideo)
     Dim objVideo As MyVideo
     Dim strChannelID As String
     strChannelID = "UCxxxxxxxxxxxxxxxxxxxx"
     objVideos = GetAllVideos(strChannelID)
     For Each objVideo In objVideos
         Debug.Print(objVideo.ID)
         Debug.Print(objVideo.Title)
         Debug.Print(objVideo.Description)
         Debug.Print(objVideo.PublishedAt)
         Debug.Print(objVideo.Thumbnail)
     Next
End Sub

Das Ergebnis finden wir schließlich im Direktbereich von Visual Studio vor (siehe Bild 3). Wie wir hier sehen, ist die Beschreibung immer an einer bestimmten Stelle abgeschnitten und endet mit drei Punkten (). Die Auflistung und auch andere API-Funktionen wie etwa die Suchfunktion liefern immer nur die gekürzte Form. Um den vollständigen Beschreibungstext zu ermitteln, benötigen wir den Abruf der Video-Informationen selbst. Wie das gelingt, schauen wir uns weiter unten an – nun wollen wir erst einmal den Abruf der Videoliste genauer betrachten.

Ausgabe der Video-Eigenschaften im Direktbereich von Visual Studio

Bild 3: Ausgabe der Video-Eigenschaften im Direktbereich von Visual Studio

Die Funktion GetAllVideos

Die Funktion zum Ermitteln aller Videos eines Kanals erwartet die Angabe der Kanal-ID als Parameter (siehe Listing 2).

Private Function GetAllVideos(strChannelID As String) As List(Of MyVideo)
     Dim objYouTubeService As YouTubeService
     Dim objVideolistRequest As SearchResource.ListRequest
     Dim objVideolistResponse As SearchListResponse
     Dim objSearchResult As SearchResult
     Dim objVideo As MyVideo
     Dim objVideos As List(Of MyVideo)
     Dim strNextPageToken As String = ""
     objYouTubeService = Authentication.AuthenticateOAuth
     objVideos = New List(Of MyVideo)
     Do While Not strNextPageToken Is Nothing
         objVideolistRequest = objYouTubeService.Search.List("snippet")
         With objVideolistRequest
             .ChannelId = strChannelID
             .Type = "video"
             .MaxResults = 50
             .PageToken = strNextPageToken
         End With
         objVideolistResponse = objVideolistRequest.Execute
         For Each objSearchResult In objVideolistResponse.Items
             objVideo = New MyVideo
             With objVideo
                 .ID = objSearchResult.Id.VideoId
                 .Title = objSearchResult.Snippet.Title
                 .Description = objSearchResult.Snippet.Description
                 .Thumbnail = objSearchResult.Snippet.Thumbnails.Default__.Url
                 .PublishedAt = objSearchResult.Snippet.PublishedAt
             End With
             objVideos.Add(objVideo)
         Next objSearchResult
         strNextPageToken = objVideolistResponse.NextPageToken
     Loop
     Return objVideos
End Function

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins DATENBANKENTWICKLER:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar