Exemplo n.º 1
0
        //下载视频
        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);
        }
Exemplo n.º 2
0
        //下载视频
        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);
        }
Exemplo n.º 3
0
        //下载视频
        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("&amp;", "&"));
                }

                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);
        }
Exemplo n.º 4
0
        //下载视频
        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));
        }
Exemplo n.º 5
0
        //下载视频
        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);
        }
Exemplo n.º 6
0
        //下载视频
        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);
        }