{"id":55000316,"date":"2022-04-01T00:00:00","date_gmt":"2023-03-02T17:05:35","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=316"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"YouTubeKanal_mit_VBNET_verwalten_Teil_2","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/YouTubeKanal_mit_VBNET_verwalten_Teil_2\/","title":{"rendered":"YouTube-Kanal mit VB.NET verwalten, Teil 2"},"content":{"rendered":"<p><b>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&uuml;r den Zugriff auf die YouTube-API registriert. Au&szlig;erdem haben wir dort die f&uuml;r den Zugriff notwendigen Zugangsdaten erstellt, die wir in der nun zu programmierenden .NET-L&ouml;sung verwenden k&ouml;nnen. In der .NET-L&ouml;sung wollen wir verschiedene Informationen zu unserem YouTube-Kanal abrufen wie die Namen der Playlisten und Informationen zu den enthaltenen Videos. Au&szlig;erdem wollen wir neue Videos anlegen und die Eigenschaften der vorhandenen Videos anpassen.<\/b><\/p>\n<p>Die Ausgangsidee zu diesem Artikel war, dass ich einen YouTube-Kanal er&ouml;ffnet habe und dort Access-Videos ver&ouml;ffentliche. Die Herausforderung dabei ist, dass ich beispielsweise im Beschreibungstext gern Links zu anderen, thematisch &auml;hnlichen Videos hinzuf&uuml;gen w&uuml;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 &uuml;ber 1.000 St&uuml;ck. Au&szlig;erdem sollen die Beschreibungstexte auch noch Links zu eventuell verf&uuml;gbaren Beispieldatenbanken enthalten.<\/p>\n<h2>Aufwendige Pflege<\/h2>\n<p>Dies alles zu pflegen, indem man die Beschreibungstexte von Hand zusammenschreibt und einzeln &uuml;ber YouTube Studio hinzuzuf&uuml;gen, w&auml;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 &uuml;ber YouTube-Videos, Artikel und ihre Verkn&uuml;pfungen befinden. Diese sollen dann per Code zu Beschreibungstexten zusammengestellt und den Videos im YouTube-Kanal hinzugef&uuml;gt werden.<\/p>\n<h2>Datenbankzugriff im zweiten Schritt<\/h2>\n<p>Den Schritt, die Daten aus der Datenbank zu beziehen, lassen wir vorerst aus &#8211; zun&auml;chst einmal wollen wir &uuml;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.<\/p>\n<h2>Verwendete Technik<\/h2>\n<p>Dass wir die L&ouml;sung mit Visual Basic .NET entwickeln wollen, haben wir bereits im ersten Teil der Artikelreihe erl&auml;utert. Es gibt alle notwendigen Bibliotheken f&uuml;r den Zugriff auf die <b>YouTube Data API v3 <\/b>und wir k&ouml;nnen von einer .NET-Anwendung auch auf die Daten einer Access-Datenbank zugreifen.<\/p>\n<p>Gegebenenfalls ist letzteres aber auch gar nicht notwendig &#8211; wir k&ouml;nnten auch eine DLL programmieren, die wir in das VBA-Projekt einer Access-Datenbank einbinden. Von dort k&ouml;nnen wir dann die Methoden und Eigenschaften dieser DLL nutzen und innerhalb der Access-Datenbank die dar&uuml;ber zu schreibenden Daten aus den Tabellen lesen.<\/p>\n<h2>Welcher Projekttyp?<\/h2>\n<p>Deshalb stellt sich die Frage, mit welchem Projekttyp wir starten. Auch wenn wir die Funktionen sp&auml;ter in einer .NET-DLL ver&ouml;ffentlichen wollen, entscheiden wir uns an dieser Stelle f&uuml;r eine WPF-Anwendung. Den Zugriff auf die Access-Datenbank mit den Daten f&uuml;r die YouTube-Videos wollen wir zun&auml;chst aussparen und stattdessen erst einmal den Zugriff auf die Daten des YouTube-Kanals realisieren sowie einige Beispieldaten in bestehende YouTube-Videos schreiben.<\/p>\n<h2>Projekt erstellen und Pakete hinzuf&uuml;gen<\/h2>\n<p>Im ersten Ansatz und zum Experimentieren erstellen wir ein neues Projekt des Typs <b>WPF-Anwendung <\/b>f&uuml;r <b>Visual Basic<\/b>. In diesem Fall haben wir die Variante f&uuml;r <b>.NET Core <\/b>verwendet. Au&szlig;erdem ben&ouml;tigen wir zwei NuGet-Pakete. Um diese hinzuzuf&uuml;gen, &ouml;ffnen wir mit dem Men&uuml;befehl <b>Projekt|NuGet-Pakete verwalten&#8230; <\/b>das <b>NuGet<\/b>-Fenster.<\/p>\n<p>Hier wechseln wir zum Bereich <b>Durchsuchen <\/b>und Suchen nacheinander nach den folgenden NuGet-Paketen und installieren diese jeweils mit einem Klick auf <b>Installieren<\/b>:<\/p>\n<ul>\n<li><b>Google.Apis.Oauth2.v2<\/b>: Erm&ouml;glicht die Authentifizierung f&uuml;r den Zugriff auf die YouTube-Daten<\/li>\n<li><b>Google.Apis.YouTube.V3<\/b>: Erm&ouml;glicht den Zugriff auf die YouTube-Daten.<\/li>\n<\/ul>\n<p>Wenn wir nach der Installation zum Bereich <b>Installiert<\/b> wechseln, sollte dieser wie in Bild 1 aussehen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_316_001.png\" alt=\"Die f&uuml;r die L&ouml;sung ben&ouml;tigten NuGet-Pakete\" width=\"700\" height=\"236,661\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Die f&uuml;r die L&ouml;sung ben&ouml;tigten NuGet-Pakete<\/span><\/b><\/p>\n<h2>Programmierung der Authentifizierung<\/h2>\n<p>Ziel der nachfolgend beschriebenen Authentifizierung ist es, ein Objekt des Typs <b>YouTubeService <\/b>zu erhalten, mit dem wir auf die Daten des YouTube-Kanals des Benutzers zugreifen k&ouml;nnen, in dessen Kontext wir uns anmelden. Diese Klasse (siehe Listing 1) bezeichnen wir mit Authentication und sie enth&auml;lt nur eine Funktion namens <b>AuthenticateOAuth<\/b>. Diese Funktion liefert nach erfolgreicher Authentifizierung das gew&uuml;nschte <b>YouTubeService<\/b>-Objekt zur&uuml;ck.<\/p>\n<pre>Imports System.IO\r\nImports System.Threading\r\nImports Google.Apis.Auth.OAuth2\r\nImports Google.Apis.Services\r\nImports Google.Apis.YouTube.v3\r\n<span style=\"color:blue;\">Public Class<\/span> Authentication\r\n     <span style=\"color:blue;\">Public <\/span>Shared Function AuthenticateOAuth()<span style=\"color:blue;\"> As <\/span>YouTubeService\r\n         <span style=\"color:blue;\">Dim <\/span>objYouTubeService<span style=\"color:blue;\"> As <\/span>Google.Apis.YouTube.v3.YouTubeService\r\n         <span style=\"color:blue;\">Dim <\/span>objUserCredential<span style=\"color:blue;\"> As <\/span>UserCredential\r\n         <span style=\"color:blue;\">Dim <\/span>objStream<span style=\"color:blue;\"> As <\/span>FileStream\r\n         objStream = <span style=\"color:blue;\">New<\/span> FileStream(\"client_secrets.json\", FileMode.Open, FileAccess.Read)\r\n         objUserCredential = GoogleWebAuthorizationBroker.AuthorizeAsync(\r\n             GoogleClientSecrets.FromStream(objStream).Secrets,\r\n             {YouTubeService.Scope.Youtube},\r\n             \"user\",\r\n             CancellationToken.None).Result\r\n         objYouTubeService = <span style=\"color:blue;\">New<\/span> YouTubeService(<span style=\"color:blue;\">New<\/span> BaseClientService.Initializer() <span style=\"color:blue;\">With<\/span> {\r\n             .HttpClientInitializer = objUserCredential\r\n         })\r\n         Return objYouTubeService\r\n     End Function\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Klasse zur Authentifizierung eines Google-Accounts<\/span><\/b><\/p>\n<p>Die Frage ist nur: Woher bekommen wir die f&uuml;r die Authentifizierung notwendigen Daten? Dazu geh&ouml;ren zwei verschiedene S&auml;tze von Informationen:<\/p>\n<ul>\n<li>Die Daten f&uuml;r die App, mit der wir uns anmelden wollen und <\/li>\n<li>die Daten f&uuml;r den Benutzer, in dessen Kontext die Anmeldung erfolgen soll.<\/li>\n<\/ul>\n<p>Die Daten f&uuml;r die App haben wir im ersten Teil der Artikelreihe mit dem Titel <b>YouTube-Kanal mit VB.NET verwalten, Teil 1 <\/b>(<b>www.vbentwickler.de\/315<\/b>) von unserem Google-Entwicklerkonto als JSON-Datei heruntergeladen und unter dem Namen <b>client_secrets.json <\/b>gespeichert. Den zweiten Satz von Daten, die Daten des Benutzers, geben wir bei der eigentlichen Authentifizierung an. Zun&auml;chst ben&ouml;tigen wir nur die Daten aus der Datei <b>client_secrets.json<\/b>. Der Einfachheit halber platzieren wir diese in dem Verzeichnis, in dem beim Debuggen der Anwendung auch die dabei erstellte <b>.exe<\/b>-Datei landet. Dabei handelt es sich um den Ordner <b>\\bin\\Debug\\net5.0-windows <\/b>unterhalb unseres Projektordners.<\/p>\n<p>Die Funktion <b>AuthenticateOAuth <\/b>liest diese Datei in ein <b>FileStream<\/b>-Objekt ein und &uuml;bergibt die enthaltenen Daten als ersten Parameter der <b>AuthorizeAsync<\/b>-Methode der Klasse <b>GoogleWebAuthroizationBroker<\/b>. Daneben werden weitere Parameter &uuml;bergeben. Der zweite lautet <b>{YouTubeService.Scope.Youtube} <\/b>und legt fest, auf welchen Bereich sich die Authentifizierung bezieht. Danach erstellen wir ein neues Objekt des Typs <b>YouTubeService <\/b>und &uuml;bergeben diesem das <b>UserCredential<\/b>-Objekt als Initialisierer. Danach gibt die Funktion das neue <b>YouTubeService<\/b>-Objekt als Ergebnis zur&uuml;ck.<\/p>\n<h2>Alle vorhandenen Videos auflisten<\/h2>\n<p>Als ersten Anwendungsfall wollen wir alle Videos eines Kanals ermitteln. Der Seite <b>MainWindow.xaml <\/b>f&uuml;gen wir dazu eine Schaltfl&auml;che wie die folgende hinzu:<\/p>\n<pre>&lt;Button x:Name=\"btnAlleVideos\" Click=\"btnAlleVideos_Click\"&gt;Alle Videos&lt;\/Button&gt;<\/pre>\n<p>In der dadurch aufgerufenen Prozedur wollen wir eine Liste von Video-Elementen mit den wichtigsten Eigenschaften eines Videos f&uuml;llen. Um diese Eigenschaften zu erfassen, wollen wir eine entsprechende Klasse verwenden.<\/p>\n<p>Diese Klasse f&uuml;gen wir hinzu, indem wir im Projektmappen-Explorer mit der rechten Maustaste auf den Namen des Projekts klicken (in diesem Fall <b>YouTubeAPIV3<\/b>) und dann den Kontextmen&uuml;eintrag <b>Hinzuf&uuml;gen|Klasse&#8230; <\/b>bet&auml;tigen. Im folgenden Dialog geben wir einfach den Namen der Klasse an, in diesem Fall <b>MyVideo.vb<\/b>, und klicken dann auf <b>Hinzuf&uuml;gen<\/b>.<\/p>\n<p>Anschlie&szlig;end f&uuml;llen wir die Klasse mit dem folgenden Code:<\/p>\n<pre><span style=\"color:blue;\">Public Class<\/span> MyVideo\r\n     <span style=\"color:blue;\">Public <\/span>Property ID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Title<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Description<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property Thumbnail<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Public <\/span>Property PublishedAt<span style=\"color:blue;\"> As Date<\/span>\r\n<span style=\"color:blue;\">End Class<\/span><\/pre>\n<p>Wer bisher Klassen nur mit VBA oder VB6 programmiert hat: Unter VB.NET ist die explizite Angabe von <b>Property Get<\/b>-\/<b>Let<\/b>-\/<b>Set<\/b>-Prozeduren nicht notwendig, die hier vorliegende abk&uuml;rzende Definition reicht f&uuml;r schreib- und lesbare Eigenschaften aus.<\/p>\n<p>Mit der oben definierten Schaltfl&auml;che l&ouml;sen wir eine Prozedur aus, die ein <b>List<\/b>-Objekt zum Aufnehmen der Videos erstellt. Den Typ der aufzunehmenden Elemente geben wir in Klammern an (<b>Of MyVideo<\/b>). Damit rufen wir eine Funktion namens <b>GetAllVideos <\/b>auf. Dieser &uuml;bergeben wir die ID des Kanals, den wir untersuchen wollen. Wo bekommen wir den her? Dazu rufen wir die folgende Seite im Browser auf:<\/p>\n<pre>https:\/\/www.youtube.com\/account_advanced<\/pre>\n<p>Die Kanal-ID befindet sich dort unter der Nutzer-ID. (siehe Bild 2) F&uuml;r den Standardkanal k&ouml;nnen wir die ID auch aus den Buchstaben <b>UC <\/b>und der Nutzer-ID zusammensetzen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_316_002.png\" alt=\"Abfragen der Kanal-ID\" width=\"649,627\" height=\"422,2911\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Abfragen der Kanal-ID<\/span><\/b><\/p>\n<p>Nach dem Aufruf der Funktion <b>GetAllVideos <\/b>ist die Liste <b>objVideos <\/b>gef&uuml;llt und wir k&ouml;nnen diese &uuml;ber die Laufvariable <b>objVideo <\/b>in einer <b>For Each<\/b>-Schleife durchlaufen und ihre Eigenschaften ausgeben:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnAlleVideos_Click(sender<span style=\"color:blue;\"> As Object<\/span>, e<span style=\"color:blue;\"> As <\/span>RoutedEventArgs)\r\n     <span style=\"color:blue;\">Dim <\/span>objVideos<span style=\"color:blue;\"> As <\/span>List(Of MyVideo)\r\n     <span style=\"color:blue;\">Dim <\/span>objVideo<span style=\"color:blue;\"> As <\/span>MyVideo\r\n     <span style=\"color:blue;\">Dim <\/span>strChannelID<span style=\"color:blue;\"> As String<\/span>\r\n     strChannelID = \"UCxxxxxxxxxxxxxxxxxxxx\"\r\n     objVideos = GetAllVideos(strChannelID)\r\n     For Each objVideo In objVideos\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(objVideo.ID)\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(objVideo.Title)\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(objVideo.Description)\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(objVideo.PublishedAt)\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(objVideo.Thumbnail)\r\n     <span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ergebnis finden wir schlie&szlig;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 (<b>&#8230;<\/b>). Die Auflistung und auch andere API-Funktionen wie etwa die Suchfunktion liefern immer nur die gek&uuml;rzte Form. Um den vollst&auml;ndigen Beschreibungstext zu ermitteln, ben&ouml;tigen wir den Abruf der Video-Informationen selbst. Wie das gelingt, schauen wir uns weiter unten an &#8211; nun wollen wir erst einmal den Abruf der Videoliste genauer betrachten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2022_02\/pic_316_003.png\" alt=\"Ausgabe der Video-Eigenschaften im Direktbereich von Visual Studio\" width=\"700\" height=\"238,9496\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Ausgabe der Video-Eigenschaften im Direktbereich von Visual Studio<\/span><\/b><\/p>\n<h2>Die Funktion GetAllVideos<\/h2>\n<p>Die Funktion zum Ermitteln aller Videos eines Kanals erwartet die Angabe der Kanal-ID als Parameter (siehe Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Private Function <\/span>GetAllVideos(strChannelID<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>List(Of MyVideo)\r\n     <span style=\"color:blue;\">Dim <\/span>objYouTubeService<span style=\"color:blue;\"> As <\/span>YouTubeService\r\n     <span style=\"color:blue;\">Dim <\/span>objVideolistRequest<span style=\"color:blue;\"> As <\/span>SearchResource.ListRequest\r\n     <span style=\"color:blue;\">Dim <\/span>objVideolistResponse<span style=\"color:blue;\"> As <\/span>SearchListResponse\r\n     <span style=\"color:blue;\">Dim <\/span>objSearchResult<span style=\"color:blue;\"> As <\/span>SearchResult\r\n     <span style=\"color:blue;\">Dim <\/span>objVideo<span style=\"color:blue;\"> As <\/span>MyVideo\r\n     <span style=\"color:blue;\">Dim <\/span>objVideos<span style=\"color:blue;\"> As <\/span>List(Of MyVideo)\r\n     <span style=\"color:blue;\">Dim <\/span>strNextPageToken<span style=\"color:blue;\"> As String<\/span> = \"\"\r\n     objYouTubeService = Authentication.AuthenticateOAuth\r\n     objVideos = <span style=\"color:blue;\">New<\/span> List(Of MyVideo)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> strNextPageToken Is Nothing\r\n         objVideolistRequest = objYouTubeService.Search.List(\"snippet\")\r\n         <span style=\"color:blue;\">With<\/span> objVideolistRequest\r\n             .ChannelId = strChannelID\r\n             .Type = \"video\"\r\n             .MaxResults = 50\r\n             .PageToken = strNextPageToken\r\n         End <span style=\"color:blue;\">With<\/span>\r\n         objVideolistResponse = objVideolistRequest.Execute\r\n         For Each objSearchResult In objVideolistResponse.Items\r\n             objVideo = <span style=\"color:blue;\">New<\/span> MyVideo\r\n             <span style=\"color:blue;\">With<\/span> objVideo\r\n                 .ID = objSearchResult.Id.VideoId\r\n                 .Title = objSearchResult.Snippet.Title\r\n                 .Description = objSearchResult.Snippet.Description\r\n                 .Thumbnail = objSearchResult.Snippet.Thumbnails.Default__.Url\r\n                 .PublishedAt = objSearchResult.Snippet.PublishedAt\r\n             End <span style=\"color:blue;\">With<\/span>\r\n             objVideos.Add(objVideo)\r\n         <span style=\"color:blue;\">Next<\/span> objSearchResult\r\n         strNextPageToken = objVideolistResponse.NextPageToken\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     Return objVideos\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000316\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000316?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000316\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"41a4e68012\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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&uuml;r den Zugriff auf die YouTube-API registriert. Au&szlig;erdem haben wir dort die f&uuml;r den Zugriff notwendigen Zugangsdaten erstellt, die wir in der nun zu programmierenden .NET-L&ouml;sung verwenden k&ouml;nnen. In der .NET-L&ouml;sung wollen wir verschiedene Informationen zu unserem YouTube-Kanal abrufen wie die Namen der Playlisten und Informationen zu den enthaltenen Videos. Au&szlig;erdem wollen wir neue Videos anlegen und die Eigenschaften der vorhandenen Videos anpassen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022022,662022,44000004,44000032],"tags":[],"yst_prominent_words":[],"class_list":["post-55000316","post","type-post","status-publish","format-standard","hentry","category-66022022","category-662022","category-Loesungen","category-VBNETProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000316","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000316"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000316\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000316"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000316"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000316"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000316"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}