如何从Youtube Data API V3获取多语言标题并将其写入csv文件,以便可读]]

问题描述 投票:0回答:1

我想从给定的播放列表中检索标题和URL,并将其写入本地csv文件,因此可以在Microsoft excel中使用。到目前为止一切顺利,没有问题,我使用https://developers.google.com/youtube/v3/code_samples/dotnet中的代码制作了一个.Net控制台项目。我的播放列表中的标题有多种语言,例如德语,希伯来语,西班牙语和俄语。要编写csv文件,我在c#中使用CsvHelper。问题是特殊的非英语字符在csv文件中显示为不可读的字符。这是我的德语播放列表代码,但无法正确显示德语特殊字符。

using System;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;

using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Upload;
using Google.Apis.Util.Store;
using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data;
using CsvHelper;
using CsvHelper.Configuration;
using System.Globalization;

namespace Youtube
{
internal class MyUploads
{
    [STAThread]
    static void Main(string[] args)
    {
        // Displays several properties of the neutral cultures.

        Console.WriteLine("YouTube Data API: My Uploads");
        Console.WriteLine("============================");

        try
        {
            new MyUploads().Run().Wait();
        }
        catch (AggregateException ex)
        {
            foreach (var e in ex.InnerExceptions)
            {
                Console.WriteLine("Error: " + e.Message);
            }
        }

        Console.WriteLine("Press any key to continue...");
        Console.ReadKey();
    }

    private async Task Run()
    {
        UserCredential credential;
        using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
        {
            credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                // This OAuth 2.0 access scope allows for read-only access to the authenticated 
                // user's account, but not other types of account access.
                new[] { YouTubeService.Scope.YoutubeReadonly },
                "user",
                CancellationToken.None,
                new FileDataStore(this.GetType().ToString())
            );
        }

        var youtubeService = new YouTubeService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = this.GetType().ToString()
        });

        var channelsListRequest = youtubeService.Channels.List("contentDetails");
        channelsListRequest.Mine = true;

        // Retrieve the contentDetails part of the channel resource for the authenticated user's channel.
        var channelsListResponse = await channelsListRequest.ExecuteAsync();

        foreach (var channel in channelsListResponse.Items)
        {
            // From the API response, extract the playlist ID that identifies the list
            // of videos uploaded to the authenticated user's channel.
            var uploadsListId = "PLcHIqbEfi5uMC-GtxiSo0kFMF3bh6BQTo"; //eng "PLcHIqbEfi5uMsr-Lx0KT8mjJ-cnNYTzbW"; 
                                    //channel.ContentDetails.RelatedPlaylists.Uploads;

            Console.WriteLine("Videos in list {0}", uploadsListId);

            System.Globalization.CultureInfo cultureInfo = new System.Globalization.CultureInfo("de-DE"); //en - GB
            CsvConfiguration csvConfiguration = new CsvConfiguration(cultureInfo);
            csvConfiguration.Delimiter = ";";

            var writer = System.IO.File.CreateText("german_videos.csv");
            var csvWriter = new CsvWriter(writer,csvConfiguration);
            var nextPageToken = "";

            csvWriter.WriteField("Title");
            csvWriter.WriteField("URL");
            csvWriter.NextRecord();

            while (nextPageToken != null)
            {
                var playlistItemsListRequest = youtubeService.PlaylistItems.List("snippet");
                playlistItemsListRequest.PlaylistId = uploadsListId;
                playlistItemsListRequest.MaxResults = 50;
                playlistItemsListRequest.PageToken = nextPageToken;

                // Retrieve the list of videos uploaded to the authenticated user's channel.
                var playlistItemsListResponse = await playlistItemsListRequest.ExecuteAsync();

                foreach (var playlistItem in playlistItemsListResponse.Items)
                {
                    // Print information about each video.
                    //Console.WriteLine("{0} ({1})", playlistItem.Snippet.Title, playlistItem.Snippet.ResourceId.VideoId);
                    csvWriter.WriteField(playlistItem.Snippet.Title);
                    csvWriter.WriteField("https://www.youtube.com/watch?v=" + playlistItem.Snippet.ResourceId.VideoId.ToString());
                    csvWriter.NextRecord();
                }

                nextPageToken = playlistItemsListResponse.NextPageToken;
            }

            csvWriter.Dispose();
            writer.Dispose();

            }
        }
    }
}
    

我想从给定的播放列表中检索标题和URL,并将其写入本地csv文件,因此可以在Microsoft excel中使用。到目前为止一切顺利,没有问题,我使用...

c# csv youtube-data-api multilingual
1个回答
0
投票

我通过写入SQL Express数据库并定义列nvarchar解决了该问题。这样就解决了语言问题。

© www.soinside.com 2019 - 2024. All rights reserved.