Получить видео с канала с помощью Youtube API V3 в C#

У меня есть веб-страница ASP.Net, на которой я показывал видео Youtube со своего канала, используя V2. Поскольку Google удалил V2 API, я пытаюсь использовать V3 API, но не могу получить видео с канала.

Я просмотрел образцы на github, но в примере показано, как создать видео, но нет способа получить видео. При поиске на SO я вижу примеры с использованием библиотеки php, я ищу что-то конкретное для C#.

Может ли кто-нибудь помочь мне в этом?


person Nitesh    schedule 30.06.2015    source источник
comment
плейлист это не то же самое, что канал @LitisqeKumar   -  person DaImTo    schedule 30.06.2015


Ответы (3)


Добавляя идентификатор канала в Search.list, он возвращает список видео на канале.

var searchListRequest = service.Search.List("snippet");
searchListRequest.ChannelId = "UCIiJ33El2EakaXBzvelc2bQ";
var searchListResult = searchListRequest.Execute();

Обновить ответ на комментарий с пояснением того, что происходит:

На самом деле поиск возвращает все, что связано с идентификатором канала, в конце концов, вы ищете идентификатор канала.

Search возвращает SearchListResponse, который содержит ряд элементов. Каждый элемент имеет тип SearchResource. Поисковые ресурсы могут иметь разные типы или виды. . На двух картинках ниже вы можете видеть, что первая — вид youtube#channel, вторая — вид youtube#video, и вам предстоит просмотреть их и найти видео на YouTube. если вы прокрутите страницу search.list до конца, вы можете попробовать и увидеть необработанный JSon, который возвращает API.

введите здесь описание изображения

введите здесь описание изображения

решение:

Теперь, если все, что вы хотите сделать, это вернуть видео, вы можете просто сказать ему, что все, что вам нужно, это видео, добавив тип к вашему запросу:

searchListRequest.Type = "video";
person DaImTo    schedule 30.06.2015
comment
Спасибо, я попробую и дам вам знать. - person Nitesh; 30.06.2015
comment
пойти на это я проверил его, прежде чем я разместил. github.com/LindaLawton/Google-Dotnet-Samples/tree/master/ у вас есть проблемы, я могу загрузить изменения в пример проекта - person DaImTo; 30.06.2015
comment
@DalmTo возвращает результат, но возвращает PlaylistID, и повторение свойства .Items не дает правильных результатов. Любые идеи? - person Nitesh; 30.06.2015
comment
как стена текста :) - person DaImTo; 30.06.2015
comment
Удивительно... Я проверил свой ChannelId, и он возвращает Itemtype типа youtube#searchResult. Пытаюсь разобраться дальше. - person Nitesh; 30.06.2015
comment
у вас есть последний пакет самородков? швы, которые я использую 1.9.0.1300, похоже, есть более новая версия, которую я мог бы попробовать и обновить. без изменений, я все еще получаю youtube#searchListResponse - person DaImTo; 30.06.2015
comment
я разобрался, спасибо - person Nitesh; 30.06.2015
comment
DalmTo, это правильная ссылка? github.com/LindaLawton/Google-Dotnet- Образцы/дерево/мастер/ - person IrishChieftain; 11.01.2019
comment
@IrishChieftain да, это самая последняя сборка из моих образцов. Дайте мне знать, если у вас возникнут какие-либо проблемы с этим. - person DaImTo; 11.01.2019

Хотя некоторое время назад меня спросили, я также некоторое время искал, как получить видео (все) с канала с помощью С#. На данный момент у меня есть метод, который поддерживает нумерацию страниц (наверное, можно сделать лучше:))

Надеюсь это поможет

    public Task<List<SearchResult>> GetVideosFromChannelAsync(string ytChannelId)
    {

        return Task.Run(() =>
        {
            List<SearchResult> res = new List<SearchResult>();

var _youtubeService = new YouTubeService(new BaseClientService.Initializer()
        {
            ApiKey = "AIzaXyBa0HT1K81LpprSpWvxa70thZ6Bx4KD666",
            ApplicationName = "Videopedia"//this.GetType().ToString()
        });

            string nextpagetoken = " ";

            while (nextpagetoken != null)
            {
                var searchListRequest = _youtubeService.Search.List("snippet");
                searchListRequest.MaxResults = 50;
                searchListRequest.ChannelId = ytChannelId;
                searchListRequest.PageToken = nextpagetoken;

                // Call the search.list method to retrieve results matching the specified query term.
                var searchListResponse = searchListRequest.Execute();

                // Process  the video responses 
                res.AddRange(searchListResponse.Items);

                nextpagetoken = searchListResponse.NextPageToken;

            }

            return res;

        });
    } 
person erPe    schedule 04.04.2016
comment
Что такое _youtubeService в вашем примере? - person leen3o; 23.05.2016
comment
можем ли мы различать видео на канале списка воспроизведения, используя этот метод? - person Priyankara; 02.10.2016
comment
@Priyankara, не могли бы вы уточнить, что вы имеете в виду? - person erPe; 03.10.2016
comment
@erPe Я имел в виду, что с помощью этого метода мы можем получить все детали видео канала. если мы хотим получить только сведения о плейлисте канала, можем ли мы использовать этот подход? - person Priyankara; 03.10.2016
comment
@Priyankara Я так не играл, но взгляните на документацию API, так как все это основано на них. Так что, если API поддерживает это, вы сможете это сделать. - person erPe; 04.10.2016
comment
@erPe хорошо, конечно. Спасибо за поддержку. - person Priyankara; 04.10.2016
comment
Привет, я не эксперт в С#... может ли кто-нибудь написать часть приложения, которое вызывает и показывает, как консоль метод? Большое спасибо - person n3o; 07.03.2021
comment
@erPe можешь мне помочь? - person n3o; 07.03.2021
comment
@ n3o Вы можете увидеть принятый ответ. Он предоставляет все детали. С чем именно вы боретесь? - person erPe; 08.03.2021

На ютуб канале много плейлистов. Под каждым плейлистом много видео. Итак, сначала я вывел плейлист, затем из каждого плейлиста вывел списки видео. Итак, вот мое решение, которое я реализовал в своем проекте. Это полный код для получения видео с канала YouTube и отображения видео как канала YouTube с информацией о том, сколько дней назад было опубликовано видео и т. д. Здесь я также реализовал кэширование для более быстрой загрузки видео. Мне нужно много времени, чтобы реализовать это. Надеюсь, это поможет.

Модель:

    public class VideoViewModel
    {
        public List<PlayList> PlayList { get; internal set; }
    }


    public class PlayList
    {

        public string Title { get; set; }
        public string Description { get; set; }
        public string Id { get; set; }
        public string Url { get; set; }
        public List<VideoList> VideoList { get; set; }


    }

    public class VideoList
    {

        public string Title { get; set; }
        public string Description { get; set; }
        public string Id { get; set; }
        public string Url { get; set; }
        public string PublishedDate { get; set; }

    }

Контроллер:

    public ActionResult Index(string VideoId, string VideoType, int? PageNo)
    {

     VideoViewModel ob = new VideoViewModel();
     ob = GetFromList();
     return View(ob);

    }


     VideoViewModel GetFromList()
     {

        VideoViewModel ob = new VideoViewModel();
        IDatabase cache = Connection.GetDatabase();
        string serializedVideos = cache.StringGet("");
        if (!String.IsNullOrEmpty(serializedVideos))
        {
            ob.PlayList = JsonConvert.DeserializeObject<List<PlayList>>(serializedVideos);

        }
        else
        {

            GetYoutubeVideosFromApi(ob);
            cache.StringSet("", JsonConvert.SerializeObject(ob.PlayList));


        }
        return ob;
    }


    public void GetYoutubeVideosFromApi(VideoViewModel ob)

    {
        ob.PlayList = new List<PlayList>();
        WebClient wc = new WebClient { Encoding = Encoding.UTF8 };
        try
        {
            string jsonstring = wc.DownloadString("https://www.googleapis.com/youtube/v3/playlists?part=snippet&key=yourkey&maxResults=50&channelId=yourchaneelid");

            JObject jobj = (JObject)JsonConvert.DeserializeObject(jsonstring);

            foreach (var entry in jobj["items"])
            {
                PlayList pl = new PlayList();


                pl.Title = entry["snippet"]["title"].ToString();
                pl.Description = entry["snippet"]["description"].ToString();
                pl.Id = entry["id"].ToString();
                pl.VideoList = new List<VideoList>();
                string jsonstring2 = wc.DownloadString("https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=" + entry["id"].ToString() + "&key=yourkey&maxResults=50");

                JObject jobj2 = (JObject)JsonConvert.DeserializeObject(jsonstring2);

                foreach (var vl in jobj2["items"])
                {
                    VideoList v = new VideoList();
                    v.Title = vl["snippet"]["title"].ToString();
                    v.Description = vl["snippet"]["description"].ToString();
                    v.Id = vl["snippet"]["resourceId"]["videoId"].ToString();
                    v.Url = vl["snippet"]["thumbnails"]["medium"]["url"].ToString();

                    var publishTime = vl["snippet"]["publishedAt"].ToString();
                    var temp = DateTime.Parse(publishTime);
                    v.PublishedDate = GetTimeInMonth(temp);

                    pl.VideoList.Add(v);

                }

                ob.PlayList.Add(pl);

            }

        }
        catch (Exception ex)
        {
            throw;
        }

    }


    public static string GetTimeInMonth(DateTime objDateTime)
    {
        const int SECOND = 1;
        const int MINUTE = 60 * SECOND;
        const int HOUR = 60 * MINUTE;
        const int DAY = 24 * HOUR;
        const int MONTH = 30 * DAY;

        var ts = new TimeSpan(DateTime.UtcNow.Ticks - objDateTime.Ticks);
        double delta = Math.Abs(ts.TotalSeconds);

        if (delta < 1 * MINUTE)
            return ts.Seconds == 1 ? "one second ago" : ts.Seconds + " seconds ago";

        if (delta < 2 * MINUTE)
            return "a minute ago";

        if (delta < 45 * MINUTE)
            return ts.Minutes + " minutes ago";

        if (delta < 90 * MINUTE)
            return "an hour ago";

        if (delta < 24 * HOUR)
            return ts.Hours + " hours ago";

        if (delta < 48 * HOUR)
            return "yesterday";

        if (delta < 30 * DAY)
            return ts.Days + " days ago";

        if (delta < 12 * MONTH)
        {
            int months = Convert.ToInt32(Math.Floor((double)ts.Days / 30));
            return months <= 1 ? "one month ago" : months + " months ago";
        }
        else
        {
            int years = Convert.ToInt32(Math.Floor((double)ts.Days / 365));
            return years <= 1 ? "one year ago" : years + " years ago";
        }

    }


     private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
    {
        string cacheConnection = ConfigurationManager.AppSettings["CacheConnection"].ToString(); 
        return ConnectionMultiplexer.Connect(cacheConnection);
    });

    public static ConnectionMultiplexer Connection
    {
        get
        {
            return lazyConnection.Value;
        }
    }

Просмотр: на самом деле это зависит от того, как вы хотите отобразить список видео.

person Mahmud    schedule 02.01.2020