你的问题是关于api的分页,看"resultsPerPage": 50
您使用的下载器页面可以做到这一点,
获得第一个结果,如果总计 > resultPerPage som 它使用"nextPageToken":"CGQQAA" 发出新请求
例子
146 个项目(总计)-> 3 个请求
50 没有 nextPageToken 返回 nextpageToken
string.Format("https://api.yoursite.com/playlist?url={0}&nextPageToken=", link)
使用 nextpagetoken 发出请求的 50 秒视频包
string.Format("https://api.yoursite.com/playlist?url={0}&nextPageToken={1}", link, nextPageToken)
Json 结果示例
{
"nextPageToken":"CGQQAA",
"totalResults":146,
"resultsPerPage":50,
"currentResults":50,
"items":{
"0":{
"id":"wh-uYV6YprA",
"title":"Private video"
},
"1":{
"id":"C6H0emVJtSw",
"title":"Ya No Entiendo Nada - Al2 (2010) Los Aldeanos"
},
"2":{
"id":"mhHES-k7Trg",
"title":"El B [Los Aldeanos]- America"
},
/* ... */
"47":{
"id":"0IbK43e3vXs",
"title":"VIOLADORES DEL VERSO - 8 LINEAS (CANAL BOA)"
},
"48":{
"id":"6xCL98XMq9Q",
"title":"SFDK (Zatu) - Cuando todo acabe (con El Chojin - Colabora Jefe De La M) [Lista de invitados(2011)]"
},
"49":{
"id":"31WFa51c4Lk",
"title":"Nach - Los Años Luz (con Diana Feria) - Un Dia En Suburbia"
}
},
"status":true
}
你可以做一些这样的
var playlist = GetPlayList("https://www.youtube.com/playlist?list=PLTPg64KdGgYivEK9avhUlxsaJhD0TfpxW");
Console.WriteLine(string.Join(playlist.Items.ToList()))
public string MakeRequest(string link, string nextPage="")
{
string url = string.Format("https://api.youtubemultidownloader.com/playlist?url={0}&nextPageToken={1}", link, nextPage);
HttpWebRequest wb = (HttpWebRequest)WebRequest.Create(url);
wb.Method = "GET";
wb.KeepAlive = true;
wb.Proxy = null;
wb.Referer = "https://youtubemultidownloader.com/playlist.html";
wb.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0";
var value = new StreamReader(wb.GetResponse().GetResponseStream()).ReadToEnd();
return value;
}
public PlayList GetPlayList(string link)
{
var json = MakeRequest(link);
var playList = PlayList.FromJson(json);
while (playList.Items.Count < playList.TotalResults)
{
json = MakeRequest(link, playList.NextPageToken);
var newPagePlayList = PlayList.FromJson(json);
playList.NextPageToken = newPagePlayList.NextPageToken;
// playList.Items = playList.Items.Concat(newPagePlayList.Items).ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
var index = 1;
playList.Items = playList.Items.Concat(newPagePlayList.Items).ToDictionary((kvp) => (index++).ToString(), kvp => kvp.Value);
}
return playList;
}
转换器
using System;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
public partial class PlayList
{
[JsonProperty("totalResults")]
public long TotalResults { get; set; }
[JsonProperty("resultsPerPage")]
public long ResultsPerPage { get; set; }
[JsonProperty("nextPageToken")]
public string NextPageToken { get; set; }
[JsonProperty("currentResults")]
public long CurrentResults { get; set; }
[JsonProperty("items")]
public Dictionary<string, Item> Items { get; set; }
[JsonProperty("status")]
public bool Status { get; set; }
}
public partial class Item
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("title")]
public string Title { get; set; }
public override string ToString() {
return string.Format("{0} -> {1}", Id, Title);
}
}
public partial class PlayList
{
public static PlayList FromJson(string json) => JsonConvert.DeserializeObject<PlayList>(json, Converter.Settings);
}
public static class Serialize
{
public static string ToJson(this PlayList self) => JsonConvert.SerializeObject(self, Converter.Settings);
}
internal static class Converter
{
public static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
{
MetadataPropertyHandling = MetadataPropertyHandling.Ignore,
DateParseHandling = DateParseHandling.None,
Converters = {
new IsoDateTimeConverter { DateTimeStyles = DateTimeStyles.AssumeUniversal }
},
};
}
2018 年 8 月 6 日更新
按请求更新连接项,修复重复键