//下载视频 public override bool Download() { //开始下载 TipText("正在分析视频地址"); //原始Url Info.Url = Info.Url.TrimStart('+'); //修正url string url = "http://www.flvcd.com/parse.php?kw=" + Tools.UrlEncode(Info.Url); try { //取得网页源文件 string src = Network.GetHtmlSource(url, Encoding.GetEncoding("GB2312"), Info.Proxy); //检查是否需要密码 if (src.Contains("请输入密码")) { TipText("等待输入密码"); string pw = ToolForm.CreatePasswordForm(true, "", ""); url = url + "&passwd=" + pw; src = Network.GetHtmlSource(url, Encoding.GetEncoding("GB2312"), Info.Proxy); } //获得所有清晰度 //获取需要的源代码部分 TipText("解析所有清晰度"); Regex rMulti = new Regex(@"用硕鼠下载.*?赞助商链接", RegexOptions.Singleline); Match mMulti = rMulti.Match(src); string allResSrc = mMulti.Value; //获取url和名称 Regex rGetAllRes = new Regex(@"<a href=""(?<url>.+?)"".+?<B>(?<mode>.+?)</B>"); MatchCollection mGetAllRes = rGetAllRes.Matches(allResSrc); if (mGetAllRes.Count >= 1) { //将url和名称填入字典中 var dict = new Dictionary <string, string>(); dict.Add(url, "默认清晰度"); foreach (Match item in mGetAllRes) { dict.Add("http://www.flvcd.com/" + item.Groups["url"].Value, item.Groups["mode"].Value); } //用户选择清晰度 url = ToolForm.CreateSingleSelectForm("在线解析引擎可以解析此视频的多种清晰度模式,\n请选择您需要的视频清晰度:", dict, url, Info.AutoAnswer, "flvcd"); //重新获取网页源文件 src = Network.GetHtmlSource(url, Encoding.GetEncoding("GB2312"), Info.Proxy); } //取得视频标题 TipText("正在解析视频"); Regex rTitle = new Regex(@"<input type=$hidden$ name=$name$ value=$(?<title>.+?)$>".Replace("$", "\"")); Match mTitle = rTitle.Match(src); string title = mTitle.Groups["title"].Value; Info.Title = title; //过滤非法字符 title = Tools.InvalidCharacterFilter(title, ""); //取得内容 var urlMatch = Regex.Match(src, @"<input type=#hidden# name=#inf# value=#(?<urls>.+?)#".Replace('#', '"')); if (!urlMatch.Success) { throw new Exception("FLVCD插件暂时不支持此URL的解析" + Environment.NewLine + Info.Url); } string content = urlMatch.Groups["urls"].Value; List <string> partUrls = new List <string>(content.Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries)); //重新设置保存目录(生成子文件夹) if (!Info.SaveDirectory.ToString().EndsWith(title)) { string newdir = Path.Combine(Info.SaveDirectory.ToString(), title); if (!Directory.Exists(newdir)) { Directory.CreateDirectory(newdir); } Info.SaveDirectory = new DirectoryInfo(newdir); } //清空地址 Info.FilePath.Clear(); //下载视频 //确定视频共有几个段落 Info.PartCount = partUrls.Count; //------------分段落下载------------ for (int i = 0; i < Info.PartCount; i++) { Info.CurrentPart = i + 1; //取得文件后缀名 string ext = Tools.GetExtension(partUrls[i]); if (string.IsNullOrEmpty(ext)) { if (string.IsNullOrEmpty(Path.GetExtension(partUrls[i]))) { ext = ".flv"; } else { ext = Path.GetExtension(partUrls[i]); } } //设置当前DownloadParameter currentParameter = new DownloadParameter() { //文件名 FilePath = Path.Combine(Info.SaveDirectory.ToString(), title + "-" + string.Format("{0:00}", i) + ext), //文件URL Url = partUrls[i], //代理服务器 Proxy = Info.Proxy }; //添加文件路径到List<>中 Info.FilePath.Add(currentParameter.FilePath); //下载文件 bool success; //提示更换新Part delegates.NewPart(new ParaNewPart(this.Info, i + 1)); //下载视频 try { success = Network.DownloadFile(currentParameter, this.Info); if (!success) //未出现错误即用户手动停止 { return(false); } } catch (Exception ex) //下载文件时出现错误 { //如果此任务由一个视频组成,则报错(下载失败) if (Info.PartCount == 1) { throw; } else //否则继续下载,设置“部分失败”状态 { Info.PartialFinished = true; Info.PartialFinishedDetail += "\r\n文件: " + currentParameter.Url + " 下载失败"; } } } //end for } catch (Exception ex) { throw; } // end try //下载成功完成 return(true); }
//下载视频 public bool Download() { //开始下载 delegates.TipText(new ParaTipText(this.Info, "正在分析视频地址")); try { //获取密码 string password = ""; if (Info.Url.EndsWith("密码")) { password = ToolForm.CreatePasswordForm(true, "", ""); } //取得网页源文件 string src = Network.GetHtmlSource(Info.Url.Replace("密码", ""), Encoding.UTF8, Info.Proxy); //分析视频id Regex r1 = new Regex(@"videoId = '(?<vid>\w+)'"); Match m1 = r1.Match(src); string vid = m1.Groups["vid"].ToString(); //取得视频标题 Regex rTitle = new Regex(@"<title>(?<title>.*)</title>"); Match mTitle = rTitle.Match(src); string title = mTitle.Groups["title"].Value.Replace(" - 在线观看", "").Replace(" - 视频", "").Replace(" - 优酷视频", ""); Info.Title = title; //过滤非法字符 title = Tools.InvalidCharacterFilter(title, ""); //视频地址数组 string[] videos = null; //清空地址 Info.FilePath.Clear(); //调用内建的优酷视频解析器 YoukuParser parserYouku = new YoukuParser(); videos = parserYouku.Parse(new ParseRequest() { Id = vid, Password = password, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer }).ToArray(); Info.videos = videos; return(true); //下载视频 //确定视频共有几个段落 Info.PartCount = videos.Length; //分段落下载 for (int i = 0; i < Info.PartCount; i++) { Info.CurrentPart = i + 1; //取得文件后缀名 //string ext = Tools.GetExtension(videos[i]); //设置当前DownloadParameter if (Info.PartCount == 1) //如果只有一段 { currentParameter = new DownloadParameter() { //文件名 例: c:\123(1).flv FilePath = Path.Combine(Info.SaveDirectory.ToString(), title + ".flv"), //文件URL Url = videos[i], //代理服务器 Proxy = Info.Proxy }; } else //如果分段有多段 { currentParameter = new DownloadParameter() { //文件名 例: c:\123(1).flv FilePath = Path.Combine(Info.SaveDirectory.ToString(), title + "(" + (i + 1).ToString() + ")" + ".flv"), //文件URL Url = videos[i], //代理服务器 Proxy = Info.Proxy }; } //添加文件路径到List<>中 Info.FilePath.Add(currentParameter.FilePath); //下载文件 bool success; //提示更换新Part delegates.NewPart(new ParaNewPart(this.Info, i + 1)); //下载视频 try { success = Network.DownloadFile(currentParameter, this.Info); if (!success) //未出现错误即用户手动停止 { return(false); } } catch (Exception ex) //下载文件时出现错误 { //如果此任务由一个视频组成,则报错(下载失败) if (Info.PartCount == 1) { throw ex; } else //否则继续下载,设置“部分失败”状态 { Info.PartialFinished = true; Info.PartialFinishedDetail += "\r\n文件: " + currentParameter.Url + " 下载失败"; } } } } catch (Exception ex) //出现错误即下载失败 { throw ex; } //下载成功完成 return(true); }
//下载视频 public bool Download() { //开始下载 delegates.TipText(new ParaTipText(this.Info, "正在分析视频地址")); //原始Url Info.Url = Info.Url.TrimStart('+'); //修正url string url = "http://www.flvcd.com/parse.php?kw=" + Tools.UrlEncode(Info.Url); try { //取得网页源文件 string src = Network.GetHtmlSource(url, Encoding.GetEncoding("GB2312"), Info.Proxy); //检查是否需要密码 if (src.Contains("请输入密码")) { string pw = ToolForm.CreatePasswordForm(true, "", ""); url = url + "&passwd=" + pw; src = Network.GetHtmlSource(url, Encoding.GetEncoding("GB2312"), Info.Proxy); } //获得所有清晰度 //获取需要的源代码部分 Regex rMulti = new Regex(@"用硕鼠下载.*?赞助商链接", RegexOptions.Singleline); Match mMulti = rMulti.Match(src); string allResSrc = mMulti.Value; //获取url和名称 Regex rGetAllRes = new Regex(@"<a href=""(?<url>.+?)"".+?<B>(?<mode>.+?)</B>"); MatchCollection mGetAllRes = rGetAllRes.Matches(allResSrc); if (mGetAllRes.Count > 1) { //将url和名称填入字典中 var dict = new Dictionary <string, string>(); dict.Add(url, "默认清晰度"); foreach (Match item in mGetAllRes) { dict.Add("http://www.flvcd.com/" + item.Groups["url"].Value, item.Groups["mode"].Value); } //用户选择清晰度 url = ToolForm.CreateSingleSelectForm("在线解析引擎可以解析此视频的多种清晰度模式,\n请选择您需要的视频清晰度:", dict, url, Info.AutoAnswer, "flvcd"); //重新获取网页源文件 src = Network.GetHtmlSource(url, Encoding.GetEncoding("GB2312"), Info.Proxy); } //取得视频标题 Regex rTitle = new Regex(@"<input type=$hidden$ name=$name$ value=$(?<title>.+?)$>".Replace("$", "\"")); Match mTitle = rTitle.Match(src); string title = mTitle.Groups["title"].Value; Info.Title = title; //过滤非法字符 title = Tools.InvalidCharacterFilter(title, ""); //取得内容 Regex rContent = new Regex("<input type=\"hidden\" name=\"inf\".+\">", RegexOptions.Singleline); Match mContent = rContent.Match(src); string content = mContent.Value; if (string.IsNullOrEmpty(content)) { throw new Exception("FLVCD插件暂时不支持此URL的解析\n" + Info.Url); } //重新设置保存目录(生成子文件夹) if (!Info.SaveDirectory.ToString().EndsWith(title)) { string newdir = Path.Combine(Info.SaveDirectory.ToString(), title); if (!Directory.Exists(newdir)) { Directory.CreateDirectory(newdir); } Info.SaveDirectory = new DirectoryInfo(newdir); } //清空地址 Info.FilePath.Clear(); //取得各个Part名称 List <string> partNames = new List <string>(); Regex rPartNames = new Regex(@"<N>(?<name>.+)"); MatchCollection mcPartNames = rPartNames.Matches(content); foreach (Match item in mcPartNames) { string pn = Tools.InvalidCharacterFilter(item.Groups["name"].Value, ""); partNames.Add(pn); } //取得各Part下载地址 List <string> partUrls = new List <string>(); Regex rPartUrls = new Regex(@"<U>(?<url>.+)"); MatchCollection mcPartUrls = rPartUrls.Matches(content); foreach (Match item in mcPartUrls) { partUrls.Add(item.Groups["url"].Value.Replace("&", "&")); } Info.videos = partUrls.ToArray(); return(true); //下载视频 //确定视频共有几个段落 Info.PartCount = partUrls.Count; //------------分段落下载------------ for (int i = 0; i < Info.PartCount; i++) { Info.CurrentPart = i + 1; //取得文件后缀名 string ext = Tools.GetExtension(partUrls[i]); if (string.IsNullOrEmpty(ext)) { if (string.IsNullOrEmpty(Path.GetExtension(partUrls[i]))) { ext = ".flv"; } else { ext = Path.GetExtension(partUrls[i]); } } //设置当前DownloadParameter currentParameter = new DownloadParameter() { //文件名 FilePath = Path.Combine(Info.SaveDirectory.ToString(), partNames[i] + ext), //文件URL Url = partUrls[i], //代理服务器 Proxy = Info.Proxy }; //添加文件路径到List<>中 Info.FilePath.Add(currentParameter.FilePath); //下载文件 bool success; //添加断点续传段 //if (File.Exists(currentParameter.FilePath)) //{ // //取得文件长度 // int len = int.Parse(new FileInfo(currentParameter.FilePath).Length.ToString()); // //设置RangeStart属性 // currentParameter.RangeStart = len; // Info.Title = "[续传]" + Info.Title; //} //else //{ // Info.Title = Info.Title.Replace("[续传]", ""); //} //提示更换新Part delegates.NewPart(new ParaNewPart(this.Info, i + 1)); //下载视频 try { success = Network.DownloadFile(currentParameter, this.Info); if (!success) //未出现错误即用户手动停止 { return(false); } } catch (Exception ex) //下载文件时出现错误 { //如果此任务由一个视频组成,则报错(下载失败) if (Info.PartCount == 1) { throw ex; } else //否则继续下载,设置“部分失败”状态 { Info.PartialFinished = true; Info.PartialFinishedDetail += "\r\n文件: " + currentParameter.Url + " 下载失败"; } } } //end for } catch (Exception ex) { throw ex; } // end try //下载成功完成 return(true); }
//下载视频 public void Download() { //开始下载 delegates.Start(new ParaStart(this.TaskId)); delegates.TipText(new ParaTipText(this.TaskId, "正在分析视频地址")); _status = DownloadStatus.正在下载; try { //获取密码 string password = ""; if (Url.EndsWith("密码")) { password = ToolForm.CreatePasswordForm(true, "", ""); } //取得网页源文件 string src = Network.GetHtmlSource(Url.Replace("密码", ""), Encoding.UTF8, delegates.Proxy); //分析视频evid string evid = ""; //取得evid Regex r1 = new Regex(@"evid = '(?<evid>.+)'"); Match m1 = r1.Match(src); evid = m1.Groups["evid"].ToString(); //取得视频标题 Regex rTitle = new Regex(@"<h(1|2) class=$(vt|pvt)$>(?<title>.+?)<".Replace("$", "\"")); Match mTitle = rTitle.Match(src); string title = mTitle.Groups["title"].Value; //过滤非法字符 title = Tools.InvalidCharacterFilter(title, ""); _title = title; //视频地址数组 string[] videos = null; //清空地址 _filePath.Clear(); //调用内建的土豆视频解析器 SixcnParser parserSixcn = new SixcnParser(); videos = parserSixcn.Parse(new string[] { evid, password }, delegates.Proxy); //下载视频 //确定视频共有几个段落 _partCount = videos.Length; //分段落下载 for (int i = 0; i < _partCount; i++) { _currentPart = i + 1; //提示更换新Part delegates.NewPart(new ParaNewPart(this.TaskId, i + 1)); //取得文件后缀名 string ext = Tools.GetExtension(videos[i]); //设置当前DownloadParameter if (_partCount == 1) //如果只有一段 { currentParameter = new DownloadParameter() { //文件名 例: c:\123(1).flv FilePath = Path.Combine(SaveDirectory.ToString(), _title + "." + ext), //文件URL Url = videos[i] }; } else //如果分段有多段 { currentParameter = new DownloadParameter() { //文件名 例: c:\123(1).flv FilePath = Path.Combine(SaveDirectory.ToString(), _title + "(" + (i + 1).ToString() + ")" + "." + ext), //文件URL Url = videos[i] }; } //添加文件路径到List<>中 _filePath.Add(currentParameter.FilePath); //下载文件 bool success; //添加断点续传段 if (File.Exists(currentParameter.FilePath)) { //取得文件长度 int len = int.Parse(new FileInfo(currentParameter.FilePath).Length.ToString()); //设置RangeStart属性 currentParameter.RangeStart = len; } //下载视频文件 success = Network.DownloadFile(currentParameter); //未出现错误即用户手动停止 if (!success) { _status = DownloadStatus.已经停止; delegates.Finish(new ParaFinish(this.TaskId, false)); return; } } } catch (Exception ex) //出现错误即下载失败 { _status = DownloadStatus.出现错误; delegates.Error(new ParaError(this.TaskId, ex)); return; } //下载成功完成 _status = DownloadStatus.载完成; delegates.Finish(new ParaFinish(this.TaskId, true)); }
//下载视频 public bool Download() { //开始下载 delegates.TipText(new ParaTipText(this.Info, "正在分析视频地址")); try { //获取密码 string password = ""; if (Info.Url.EndsWith("密码")) { password = ToolForm.CreatePasswordForm(true, "", ""); Info.Url.Replace("密码", ""); } //取得网页源文件 string src = Network.GetHtmlSource(Info.Url, Encoding.GetEncoding("GBK"), Info.Proxy); //分析视频iid string iid = ""; //取得iid Regex rlist = new Regex(@"(a|l)(?<aid>\d+)(i(?<iid>\d+)|)(?=\.html)"); Match mlist = rlist.Match(Info.Url); if (mlist.Success) //如果是列表中的视频 { //尝试取得url中的iid if (!string.IsNullOrEmpty(mlist.Groups["iid"].Value)) { iid = mlist.Groups["iid"].Value; } else //否则取得源文件中的iid { Regex r1 = new Regex(@"defaultIid = (?<iid>\d+)"); Match m1 = r1.Match(src); iid = m1.Groups["iid"].ToString(); } } else //如果是普通视频(或新列表视频) { //URL中获取id var mIdInUrl = Regex.Match(Info.Url, @"(listplay|albumplay)/(?<l>.+?)/(?<i>.+?)(?=\.html)"); if (mIdInUrl.Success) { iid = mIdInUrl.Groups["i"].Value; } else { //2012.08.26 - 08.27修改 albumplay进到这儿的等号两边是没空格的。。 var mIdInSrc = Regex.Match(src, @"(listData = |listData=)\[{\niid.+?icode:""(?<icode>[\w\-]+)""", RegexOptions.Singleline); if (mIdInSrc.Success) { iid = mIdInSrc.Groups["icode"].Value; } else { Regex r1 = new Regex(@"(I|i)id = (?<iid>\d+)"); Match m1 = r1.Match(src); iid = m1.Groups["iid"].ToString(); } } } //视频地址数组 string[] videos = null; //清空地址 Info.FilePath.Clear(); //调用内建的土豆视频解析器 TudouParser parserTudou = new TudouParser(); var pr = parserTudou.Parse(new ParseRequest() { Id = iid, Password = password, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer }); videos = pr.ToArray(); //取得视频标题 string title = ""; if (pr.SpecificResult.ContainsKey("title")) { title = pr.SpecificResult["title"]; } else { //if (mlist.Success) //{ // //取得aid/lid标题 // string aid = mlist.Groups["aid"].Value; // Regex rlisttitle = null; // Match mlisttitle = null; // if (mlist.ToString().StartsWith("a")) //如果是a开头的列表 // { // rlisttitle = new Regex(@"aid:" + aid + @"\n,name:""(?<title>.+?)""", RegexOptions.Singleline); // mlisttitle = rlisttitle.Match(src); // } // else if (mlist.ToString().StartsWith("l")) //如果是l开头的列表 // { // rlisttitle = new Regex(@"ltitle = ""(?<title>.+?)""", RegexOptions.Singleline); // mlisttitle = rlisttitle.Match(src); // } // //取得iid标题 // Regex rsubtitle = new Regex(@"iid:" + iid + @"\n(,cartoonType:\d+\n|),title:""(?<subtitle>.+?)""", RegexOptions.Singleline); // Match msubtitle = rsubtitle.Match(src); // title = mlisttitle.Groups["title"].Value + "-" + msubtitle.Groups["subtitle"].Value; //} //else //{ Regex rTitle = new Regex(@"\<h1\>(?<title>.*)\<\/h1\>"); Match mTitle = rTitle.Match(src); title = mTitle.Groups["title"].Value; //} } Info.Title = title; //过滤非法字符 title = Tools.InvalidCharacterFilter(title, ""); Info.videos = videos; return(true); //下载视频 //确定视频共有几个段落 Info.PartCount = videos.Length; //分段落下载 for (int i = 0; i < Info.PartCount; i++) { Info.CurrentPart = i + 1; //取得文件后缀名 string ext = Tools.GetExtension(videos[i]); if (ext == ".f4v") { ext = ".flv"; } //设置当前DownloadParameter if (Info.PartCount == 1) //如果只有一段 { currentParameter = new DownloadParameter() { //文件名 例: c:\123(1).flv FilePath = Path.Combine(Info.SaveDirectory.ToString(), title + ext), //文件URL Url = videos[i], //代理服务器 Proxy = Info.Proxy }; } else //如果分段有多段 { currentParameter = new DownloadParameter() { //文件名 例: c:\123(1).flv FilePath = Path.Combine(Info.SaveDirectory.ToString(), title + "(" + (i + 1).ToString() + ")" + ext), //文件URL Url = videos[i], //代理服务器 Proxy = Info.Proxy }; } //添加文件路径到List<>中 Info.FilePath.Add(currentParameter.FilePath); //下载文件 bool success; //提示更换新Part delegates.NewPart(new ParaNewPart(this.Info, i + 1)); //下载视频文件 success = Network.DownloadFile(currentParameter, this.Info); //下载视频 try { success = Network.DownloadFile(currentParameter, this.Info); if (!success) //未出现错误即用户手动停止 { return(false); } } catch (Exception ex) //下载文件时出现错误 { //如果此任务由一个视频组成,则报错(下载失败) if (Info.PartCount == 1) { throw ex; } else //否则继续下载,设置“部分失败”状态 { Info.PartialFinished = true; Info.PartialFinishedDetail += "\r\n文件: " + currentParameter.Url + " 下载失败"; } } } //下载弹幕(dp) if ((Info.DownloadTypes & DownloadType.Subtitle) != 0) { try { Network.DownloadFile(new DownloadParameter() { FilePath = Path.Combine(Info.SaveDirectory.ToString(), title + ".json"), Url = "http://comment.dp.tudou.com/comment/get/" + pr.SpecificResult["iid"] + "/vdn12d/", Proxy = Info.Proxy }); } catch { } } } catch (Exception ex) //出现错误即下载失败 { throw ex; } //下载成功完成 return(true); }
//下载视频 public bool Download() { //开始下载 delegates.TipText(new ParaTipText(this.Info, "正在分析视频地址")); try { //获取密码 string password = ""; if (Info.Url.EndsWith("密码")) { password = ToolForm.CreatePasswordForm(true, "", ""); Info.Url.Replace("密码", ""); } //取得网页源文件 string src = Network.GetHtmlSource(Info.Url, Encoding.GetEncoding("GBK"), Info.Proxy); //分析视频iid string iid = ""; //取得iid Regex rlist = new Regex(@"(a|l)(?<aid>\d+)(i(?<iid>\d+)|)(?=\.html)"); Match mlist = rlist.Match(Info.Url); if (mlist.Success) //如果是列表中的视频 { //尝试取得url中的iid if (!string.IsNullOrEmpty(mlist.Groups["iid"].Value)) { iid = mlist.Groups["iid"].Value; } else //否则取得源文件中的iid { Regex r1 = new Regex(@"defaultIid = (?<iid>\d.*)"); Match m1 = r1.Match(src); iid = m1.Groups["iid"].ToString(); } } else //如果是普通视频(或新列表视频) { //2012.08.26修改: // http://www.tudou.com/listplay/69gOmmDlugI/JJKorVrTgPk.html 走这个if后面会有问题,但用listData的话是好的,就注释掉了 //URL中获取id /*var mIdInUrl = Regex.Match(Info.Url, @"listplay/(?<l>.+?)/(?<i>.+?)(?=\.html)"); * if (mIdInUrl.Success) * { * iid = mIdInUrl.Groups["i"].Value; * } * else*/ { //2012.08.26修改 albumplay进到这儿的等号两边是没空格的。。 var mIdInSrc = Regex.Match(src, @"((?<=listData = \[{\niid:)|(?<=listData=\[{\niid:))\w+"); if (mIdInSrc.Success) { iid = mIdInSrc.Value; } else { Regex r1 = new Regex(@"(I|i)id = (?<iid>\d.*)"); Match m1 = r1.Match(src); iid = m1.Groups["iid"].ToString(); //2012.08.26修改: 针对 http://www.tudou.com/programs/view/ShtKrHZ5O_8/?fr=rec2 的情况,这时候iid=88582122 ,icode = 'ShtKrHZ5O_8' ,oid = 91827385 (后面大量) int space_pos = iid.IndexOf(' '); if (space_pos >= 0) { iid = iid.Substring(0, space_pos); } } } } //取得视频标题 string title = ""; if (mlist.Success) { //取得aid/lid标题 string aid = mlist.Groups["aid"].Value; Regex rlisttitle = null; Match mlisttitle = null; if (mlist.ToString().StartsWith("a")) //如果是a开头的列表 { rlisttitle = new Regex(@"aid:" + aid + @"\n,name:""(?<title>.+?)""", RegexOptions.Singleline); mlisttitle = rlisttitle.Match(src); } else if (mlist.ToString().StartsWith("l")) //如果是l开头的列表 { rlisttitle = new Regex(@"ltitle = ""(?<title>.+?)""", RegexOptions.Singleline); mlisttitle = rlisttitle.Match(src); } //取得iid标题 Regex rsubtitle = new Regex(@"iid:" + iid + @"\n(,cartoonType:\d+\n|),title:""(?<subtitle>.+?)""", RegexOptions.Singleline); Match msubtitle = rsubtitle.Match(src); title = mlisttitle.Groups["title"].Value + "-" + msubtitle.Groups["subtitle"].Value; } else { Regex rTitle = new Regex(@"\<h1\>(?<title>.*)\<\/h1\>"); Match mTitle = rTitle.Match(src); title = mTitle.Groups["title"].Value; } Info.Title = title; //过滤非法字符 title = Tools.InvalidCharacterFilter(title, ""); //视频地址数组 string[] videos = null; //清空地址 Info.FilePath.Clear(); //调用内建的土豆视频解析器 TudouParser parserTudou = new TudouParser(); videos = parserTudou.Parse(new ParseRequest() { Id = iid, Password = password, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer }).ToArray(); Info.videos = videos; return(true); //下载视频 //确定视频共有几个段落 Info.PartCount = videos.Length; //分段落下载 for (int i = 0; i < Info.PartCount; i++) { Info.CurrentPart = i + 1; //取得文件后缀名 string ext = Tools.GetExtension(videos[i]); if (ext == ".f4v") { ext = ".flv"; } //设置当前DownloadParameter if (Info.PartCount == 1) //如果只有一段 { currentParameter = new DownloadParameter() { //文件名 例: c:\123(1).flv FilePath = Path.Combine(Info.SaveDirectory.ToString(), title + ext), //文件URL Url = videos[i], //代理服务器 Proxy = Info.Proxy }; } else //如果分段有多段 { currentParameter = new DownloadParameter() { //文件名 例: c:\123(1).flv FilePath = Path.Combine(Info.SaveDirectory.ToString(), title + "(" + (i + 1).ToString() + ")" + ext), //文件URL Url = videos[i], //代理服务器 Proxy = Info.Proxy }; } //添加文件路径到List<>中 Info.FilePath.Add(currentParameter.FilePath); //下载文件 bool success; //提示更换新Part delegates.NewPart(new ParaNewPart(this.Info, i + 1)); //下载视频文件 success = Network.DownloadFile(currentParameter, this.Info); //下载视频 try { success = Network.DownloadFile(currentParameter, this.Info); if (!success) //未出现错误即用户手动停止 { return(false); } } catch (Exception ex) //下载文件时出现错误 { //如果此任务由一个视频组成,则报错(下载失败) if (Info.PartCount == 1) { throw ex; } else //否则继续下载,设置“部分失败”状态 { Info.PartialFinished = true; Info.PartialFinishedDetail += "\r\n文件: " + currentParameter.Url + " 下载失败"; } } } } catch (Exception ex) //出现错误即下载失败 { throw ex; } //下载成功完成 return(true); }