示例#1
0
        /// <summary>Show a dialog to select the desired time frames</summary>
        public void ShowTimeFrameSelection(Transmitter trans)
        {
            // Get the list of currently selected time frames
            var existing = trans.TimeFrames;

            // Show a dialog for selecting time frames
            var dlg = new ToolForm
            {
                Text            = "Select Time Frames",
                FormBorderStyle = FormBorderStyle.SizableToolWindow,
                StartPosition   = FormStartPosition.CenterParent,
                ShowInTaskbar   = false,
                Size            = new Size(250, 360),
            };
            var chklist = dlg.Controls.Add2(new CheckedListBox {
                Dock = DockStyle.Fill
            });

            foreach (var tf in Enum <ETimeFrame> .Values)
            {
                chklist.Items.Add(tf, existing.Contains(tf));
            }
            dlg.ShowDialog();

            // Update the list of time frames
            var new_list = chklist.CheckedItems.OfType <ETimeFrame>().ToArray();

            trans.TimeFrames = new_list;

            // Make this list the new default set
            Settings.DefaultTimeFrames = new_list;
        }
示例#2
0
        protected override void OnClick()
        {
            AppSingleton.Instance().CreateWorkspacePath();
            ToolForm form = new ToolForm();

            form.ShowDialog();
        }
示例#3
0
        public ParseResult Parse(ParseRequest request)
        {
            var httpRequest = (HttpWebRequest)WebRequest.Create(@"http://jiexi.acfun.info/index.php?type=mobileclient&vid=" + request.Id);

            httpRequest.Proxy     = request.Proxy;
            httpRequest.UserAgent = "Dalvik/1.6.0 (Linux; U; Android 4.2.2; H30-U10 Build/HuaweiH30-U10)";
            httpRequest.Accept    = "application/json";
            httpRequest.Headers.Add("Accept-Encoding", "gzip");

            var json   = Network.GetHtmlSource(httpRequest, Encoding.UTF8);
            var acInfo = JsonConvert.DeserializeObject <AcInfo>(json);

            if (acInfo.code != 200)
            {
                throw new Exception("AcfunInterfaceParser: " + acInfo.message);
            }

            var pr = new ParseResult();

            var qualityDict = new Dictionary <string, string>();

            AddQualityDict(qualityDict, acInfo.result);
            string chosenQuality = ToolForm.CreateSingleSelectForm("请选择视频清晰度:", qualityDict, "", request.AutoAnswers, "acfun");
            var    videoInfo     = GetVideoInfoFromQuality(acInfo, chosenQuality);

            //视频总长度
            pr.SpecificResult.Add("totallength", videoInfo.totalseconds.ToString());
            //Framecount
            pr.SpecificResult.Add("framecount", "0");
            //src
            pr.SpecificResult.Add("src", "200");
            //vstr
            pr.SpecificResult.Add("vstr", "");

            videoInfo.files.ForEach(file =>
            {
                pr.Items.Add(new ParseResultItem
                {
                    RealAddress = file.url,
                    Information = new SerializableDictionary <string, string>()
                    {
                        { "length", (file.seconds * 1000).ToString() },
                        { "order", file.no.ToString() }
                    }
                });
            });

            return(pr);
        }
示例#4
0
        /// <summary>
        /// 下载并更换当前壁纸
        /// </summary>
        public override bool Download()
        {
            TipText("正在选择区域");

            var now = DateTime.Now;

            //修正URL
            if (Info.Url.Equals("bing", StringComparison.CurrentCultureIgnoreCase))
            {
                Info.Url = "bing" + now.Year.ToString() + now.Month.ToString("D2")
                           + now.Day.ToString("D2");
            }
            else
            {
                var m = Regex.Match(Info.Url, @"(?<y>\d{4})(?<m>\d{2})(?<d>\d{2})");
                now = new DateTime(int.Parse(m.Groups["y"].Value), int.Parse(m.Groups["m"].Value), int.Parse(m.Groups["d"].Value));
            }

            //mkt代码-国家 字典
            var dictMarketRegion = new SerializableDictionary <string, string>();
            //mkt代码-图片URL 字典
            var dictMarketPic = new SerializableDictionary <string, string>();
            //mkt代码-图片本地位置 字典
            var dictMarketFile = new Dictionary <string, string>();

            //获取所有区域的背景图片地址
            //如果之前没有缓存
            if (!Settings.ContainsKey("dictMarketRegion") || !Settings.ContainsKey("dictMarketPic"))
            {
                var worldwidesrc = Network.GetHtmlSource("http://www.bing.com/account/worldwide", Encoding.UTF8, Info.Proxy);
                var mcMarkets    = Regex.Matches(worldwidesrc, @"scope=web&amp;setmkt=(?<mkt>.+?)&.+?>(?<region>.+?)</a>");

                foreach (Match mMarket in mcMarkets)
                {
                    dictMarketRegion.Add(mMarket.Groups["mkt"].Value, mMarket.Groups["region"].Value);
                }


                //获取每个区域的背景图
                foreach (string key in dictMarketRegion.Keys)
                {
                    TipText("正在获取图片地址: " + dictMarketRegion[key]);
                    var marketsrc = Network.GetHtmlSource("http://www.bing.com/?scope=web&setmkt=" + key, Encoding.UTF8);
                    //获取背景图真实地址
                    var image = "http://www.bing.com" + Regex.Match(marketsrc, @"(?<=g_img={url:').+?(?=')").Value;
                    //添加到字典
                    dictMarketPic.Add(key, image);
                }
                //序列化
                Settings["dictMarketRegion"] = SerializableDictionary <string, string> .WriteToString(dictMarketRegion);

                Settings["dictMarketPic"] = SerializableDictionary <string, string> .WriteToString(dictMarketPic);
            }
            else
            {
                //反序列化
                dictMarketRegion = SerializableDictionary <string, string> .LoadFromString(Settings["dictMarketRegion"]);

                dictMarketPic = SerializableDictionary <string, string> .LoadFromString(Settings["dictMarketPic"]);
            }

            //设置任务标题
            Info.Title = string.Format("Bing每日壁纸: {0}年{1}月{2}日", now.Year,
                                       now.Month.ToString("D2"), now.Day.ToString("D2"));

            //下载所有图片
            int i = 1;

            Info.FilePath.Clear();
            foreach (string key in dictMarketPic.Keys)
            {
                //新分段
                NewPart(i++, dictMarketPic.Count);
                //设置文件名 如 C:\Bing-20120123\china.jpg
                var ext = Path.GetExtension(dictMarketPic[key]);
                if (ext != ".png" || ext != ".jpg")
                {
                    ext = ".jpg";
                }
                var filename = "Bing" + "-" + now.Year.ToString() + now.Month.ToString("D2")
                               + now.Day.ToString("D2") + @"\" + dictMarketRegion[key] + ext;
                filename = Path.Combine(Info.SaveDirectory.ToString(), filename);
                Info.FilePath.Add(filename);
                dictMarketFile.Add(key, filename);

                //设置下载参数
                p.FilePath = filename;
                p.Url      = dictMarketPic[key];
                p.Proxy    = Info.Proxy;

                //下载图片
                DownloadFile();
            }

            //设置壁纸
            if (!Tools.IsRunningOnMono)
            {
                //选择地区
                var regionMkt = ToolForm.CreateSingleSelectForm("请选择需要设为壁纸的图片:", dictMarketRegion, "zh-CN", null, "bing");
                var file      = dictMarketFile[regionMkt];
                SystemParametersInfo(20, 0, file, 0x01 | 0x02);
            }

            return(true);
        }
示例#5
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);
        }
示例#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);
        }
示例#7
0
文件: Imanhua.cs 项目: ikde/acdown
        //下载视频
        public bool Download()
        {
            //开始下载
            delegates.TipText(new ParaTipText(this.Info, "正在分析漫画地址"));

            if (currentParameter != null)
            {
                //将停止flag设置为true
                currentParameter.IsStop = false;
            }

            try
            {
                //取得Url源文件
                string src = Network.GetHtmlSource(Info.Url, Encoding.GetEncoding("GB2312"), Info.Proxy);

                //要下载的Url列表
                var subUrls = new Collection <string>();

                //分析漫画id和lid
                Regex  r   = new Regex(@"http://(www\.|)imanhua\.com/comic/(?<id>\d+)(/list_(?<lid>\d+)\.html|)");
                Match  m   = r.Match(Info.Url);
                string id  = m.Groups["id"].Value;
                string lid = m.Groups["lid"].Value;

                #region 确定是整部漫画还是单独一话

                //lid为空 则为整部漫画
                if (string.IsNullOrEmpty(lid))
                {
                    //取得所有漫画的列表
                    Regex           rAllComics  = new Regex(@"<a href=$(?<suburl>/comic/\d+/list_\d+.html)$ title=$(?<title>.*?)$".Replace("$", "\""));
                    MatchCollection mcAllComics = rAllComics.Matches(src);

                    //填充字典
                    var dict = new Dictionary <string, string>();

                    foreach (Match item in mcAllComics)
                    {
                        dict.Add("http://www.imanhua.com" + item.Groups["suburl"].Value,
                                 item.Groups["title"].Value);
                    }

                    //选择下载哪部漫画
                    //提取用户上次选择的章节 如果配置中有Chosen项
                    if (Info.Settings.ContainsKey("Chosen") && !string.IsNullOrEmpty(Info.Settings["Chosen"]))
                    {
                        foreach (var u in Info.Settings["Chosen"].Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries))
                        {
                            subUrls.Add(u);
                        }
                    }
                    else
                    {
                        subUrls = ToolForm.CreateMultiSelectForm(dict, Info.AutoAnswer, "imanhua");
                    }

                    //如果用户没有选择任何章节
                    if (subUrls.Count == 0)
                    {
                        return(false);
                    }

                    //取得漫画标题
                    Regex  rTitle = new Regex(@"\<h1\>(?<title>.*)\<\/h1\>");
                    Match  mTitle = rTitle.Match(src);
                    string title  = mTitle.Groups["title"].Value;
                    //过滤标题中的非法字符
                    title      = Tools.InvalidCharacterFilter(title, "");
                    Info.Title = title;
                }
                else                 //如果不是整部漫画则添加此单话url
                {
                    subUrls.Add(Info.Url);
                    //取得漫画标题
                    //取得上级页面的url
                    Regex  rGetParent = new Regex(@"http://www\.imanhua\.com/comic/\d+/");
                    Match  mGetParent = rGetParent.Match(Info.Url);
                    string parentUrl  = mGetParent.ToString();
                    //取得源代码并分析
                    string pSrc = Network.GetHtmlSource(parentUrl, Encoding.GetEncoding("GB2312"), Info.Proxy);
                    //取得漫画标题
                    Regex  rTitle = new Regex(@"\<h1\>(?<title>.*)\<\/h1\>");
                    Match  mTitle = rTitle.Match(pSrc);
                    string title  = mTitle.Groups["title"].Value;
                    //过滤标题中的非法字符
                    title      = Tools.InvalidCharacterFilter(title, "");
                    Info.Title = title;
                }                 //end if

                #endregion

                //将用户选择的漫画章节存入配置
                var sbChosen = new StringBuilder();
                foreach (var suburl in subUrls)
                {
                    sbChosen.Append(suburl + "|");
                }
                Info.Settings["Chosen"] = sbChosen.ToString();

                #region  择服务器


                //取得服务器配置文件
                string          serverjs = Network.GetHtmlSource(@"http://www.imanhua.com/v2/config/config.js", Encoding.GetEncoding("GB2312"), Info.Proxy);
                Regex           rServer  = new Regex(@"arrHost\[\d+\][ =""'\[]+(?<server>.+?)[""', ]+(?<ip>.+?)[""']\]");
                MatchCollection mServers = rServer.Matches(serverjs);

                //添加到数组中
                Dictionary <string, string> servers = new Dictionary <string, string>();
                foreach (Match item in mServers)
                {
                    if (!servers.ContainsKey(item.Groups["ip"].Value))
                    {
                        servers.Add(item.Groups["ip"].Value, item.Groups["server"].Value);
                    }
                }

                //选择服务器
                string serverName = ToolForm.CreateSingleSelectForm("", servers, "", Info.AutoAnswer, "imanhua");

                #endregion

                #region  载漫画

                //建立文件夹
                string mainDir = Info.SaveDirectory + (Info.SaveDirectory.ToString().EndsWith(@"\") ? "" : @"\") + Info.Title;
                //确定漫画共有几个段落
                Info.PartCount = subUrls.Count;
                int i = 0;

                //分段落下载
                foreach (string surl in subUrls)
                {
                    Info.CurrentPart = i + 1;
                    //提示更换新Part
                    delegates.NewPart(new ParaNewPart(this.Info, i + 1));

                    //分析漫画id和lid
                    Regex  rSubUrl   = new Regex(@"http://(www\.|)imanhua\.com/comic/(?<bid>\d+)(/list_(?<cid>\d+)\.html|)");
                    Match  mSubUrl   = rSubUrl.Match(surl);
                    string bookId    = mSubUrl.Groups["bid"].Value;
                    string chapterId = mSubUrl.Groups["cid"].Value;

                    //地址数组
                    List <string> fileUrls = new List <string>();

                    //分析源代码,取得下载地址
                    WebClient wc = new WebClient();
                    //if (Info.Proxy != null)
                    wc.Proxy = Info.Proxy;

                    //取得源代码
                    byte[] buff   = wc.DownloadData(surl);
                    string cookie = wc.ResponseHeaders.Get("Set-Cookie");
                    string source = Encoding.GetEncoding("GB2312").GetString(buff);
                    //取得标题
                    //Regex rTitle = new Regex(@"<span id=""position"">.+?>> <a href="".+?"">(?<title>.+?)</a> >> <a href="".+?"">(?<subtitle>.+?)</a></span>");
                    //Match mTitle = rTitle.Match(source);
                    //string subTitle = mTitle.Groups["subtitle"].Value;
                    string subTitle = Regex.Match(source, @"(?<=<h2>).+?(?=</h2>)").Value;
                    //过滤子标题中的非法字符
                    subTitle = Tools.InvalidCharacterFilter(subTitle, "");
                    //合并本地路径(文件夹)
                    string subDir = mainDir + @"\" + subTitle;
                    //创建文件夹
                    Directory.CreateDirectory(subDir);


                    ////检查是否是老版本
                    //if (int.Parse(chapterId) > 7910) //7910之后为新版本
                    //{
                    //如果使用动态生成
                    if (source.Contains(@"var cInfo={"))
                    {
                        //获取所有文件名
                        Regex           rFileName   = new Regex(@"(?<="")[^,]+(?="")");
                        MatchCollection mcFileNames = rFileName.Matches(Regex.Match(source, @"(?<=""files"":\[).+?(?=\])").Value);
                        foreach (Match file in mcFileNames)
                        {
                            if (file.Value.StartsWith("/"))
                            {
                                fileUrls.Add(serverName + file.Value);
                            }
                            else
                            {
                                fileUrls.Add(serverName + "/Files/Images/" + bookId + "/" + chapterId + "/" + file.Value);
                            }
                        }
                    }
                    else
                    {
                        //获取所有文件名
                        //获取页面HTML中的js段
                        Regex  rJsFiles = new Regex(@"(?<=var pic=\[).+?(?=\])");
                        string jsFiles  = rJsFiles.Match(source).Value;

                        //获取所有图片文件
                        Regex           rFileName   = new Regex(@"(?<="")[^,]+(?="")");
                        MatchCollection mcFileNames = rFileName.Matches(jsFiles);
                        foreach (Match file in mcFileNames)
                        {
                            fileUrls.Add(serverName + (file.Value.StartsWith("/") ? file.Value : "/" + file.Value));
                        }
                    }

                    //输出真实地址
                    StringBuilder sb = new StringBuilder(fileUrls.Count);
                    foreach (var file in fileUrls)
                    {
                        sb.Append(file + "|");
                    }
                    Info.Settings["ExportUrl"] = sb.ToString();
                    sb = null;


                    //设置下载长度
                    currentParameter.TotalLength = fileUrls.Count;

                    //下载文件!

                    for (int j = 0; j < fileUrls.Count; j++)
                    {
                        if (currentParameter.IsStop)
                        {
                            return(false);
                        }
                        try
                        {
                            wc.Headers.Add("Referer", subUrls[i]);
                            wc.Headers.Add("Cookie", cookie);
                            byte[] content = wc.DownloadData(fileUrls[j]);
                            string fn      = Path.GetFileName(fileUrls[j]);
                            File.WriteAllBytes(Path.Combine(subDir, fn), content);
                        }
                        catch { }         //end try
                        currentParameter.DoneBytes = j;
                    }                     // end for

                    i++;
                }                //end foreach
            }                    //end try
            catch (Exception ex) //出现错误即下载失败
            {
                throw ex;
            }            //end try


            #endregion



            //下载成功完成
            currentParameter.DoneBytes = currentParameter.TotalLength;
            return(true);
        }        //end DownloadVideo
示例#8
0
        public override bool Download()
        {
            //开始下载
            TipText("正在开始任务");

            //获取视频编号
            string sm = Regex.Match(Info.Url, @"(?<=(http://www\.nicovideo\.jp/watch/|))sm\d+").Value;

            //修正简写URL
            if (Info.Url.StartsWith("sm", StringComparison.CurrentCultureIgnoreCase))
            {
                Info.Url = "http://www.nicovideo.jp/watch/" + Info.Url;
            }

            //获取网页源代码
            string src = Network.GetHtmlSource(Info.Url, Encoding.UTF8, Info.Proxy);
            //匹配登录按钮
            Match mLoginButton = Regex.Match(src, "(?<=アカウント新規登録へ.+?<a href=\").+?(?=\">.+?ログイン画面へ)");
            //获取登录地址
            string loginUrl = mLoginButton.Value;

            TipText("正在登录Nico");

            //向网页Post数据
            CookieContainer cookies = new CookieContainer();
            //登录NicoNico
            UserLoginInfo user;

            //检查插件配置
            try
            {
                user          = new UserLoginInfo();
                user.Username = Encoding.UTF8.GetString(Convert.FromBase64String(Info.Settings["user"]));
                user.Password = Encoding.UTF8.GetString(Convert.FromBase64String(Info.Settings["password"]));
                if (string.IsNullOrEmpty(user.Username) || string.IsNullOrEmpty(user.Password))
                {
                    throw new Exception();
                }
            }
            catch
            {
                user = ToolForm.CreateLoginForm(null, "https://secure.nicovideo.jp/secure/register");
                Info.Settings["user"]     = Convert.ToBase64String(Encoding.UTF8.GetBytes(user.Username));
                Info.Settings["password"] = Convert.ToBase64String(Encoding.UTF8.GetBytes(user.Password));
            }
            //Post的数据
            string postdata = string.Format("next_url={0}&mail={1}&password={2}", sm, Tools.UrlEncode(user.Username), Tools.UrlEncode(user.Password));

            byte[] data = Encoding.UTF8.GetBytes(postdata);
            //生成请求
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://secure.nicovideo.jp/secure/login?site=niconico");

            req.Proxy             = Info.Proxy;
            req.AllowAutoRedirect = false;
            req.Method            = "POST";
            req.Referer           = loginUrl;
            req.ContentType       = "application/x-www-form-urlencoded";
            req.ContentLength     = data.Length;
            req.UserAgent         = "Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0";
            req.CookieContainer   = new CookieContainer();
            //发送POST数据
            using (var outstream = req.GetRequestStream())
            {
                outstream.Write(data, 0, data.Length);
                outstream.Flush();
            }
            //关闭请求
            req.GetResponse().Close();
            cookies = req.CookieContainer;             //保存cookies

            TipText("正在解析视频标题");

            //解析视频标题
            HttpWebRequest reqTitle = (HttpWebRequest)HttpWebRequest.Create(Info.Url);

            reqTitle.Proxy = Info.Proxy;
            //设置cookies
            reqTitle.CookieContainer = cookies;
            //获取视频信息
            string srcTitle = Network.GetHtmlSource(reqTitle, Encoding.UTF8);

            //视频标题
            Info.Title = Regex.Match(srcTitle, @"(?<=<title>).+?(?=</title>)").Value.Replace("‐ ニコニコ動画(原宿)", "").Trim();
            //Info.Title = Regex.Match(srcTitle, @"(?<=<span class=""videoHeaderTitle"">).+?(?=</span>)").Value;
            string title = Tools.InvalidCharacterFilter(Info.Title, "");

            TipText("正在分析视频地址");

            //通过API获取视频信息
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(@"http://flapi.nicovideo.jp/api/getflv/" + sm);

            request.Method = "POST";
            request.Proxy  = Info.Proxy;
            //设置cookies
            request.CookieContainer = cookies;
            //获取视频信息
            string videoinfo = Network.GetHtmlSource(request, Encoding.ASCII);
            //视频真实地址
            string video = Regex.Match(videoinfo, @"(?<=url=).+?(?=&)").Value;

            video = video.Replace("%3A", ":").Replace("%2F", "/").Replace("%3F", "?").Replace("%3D", "=");

            //下载视频
            NewPart(1, 1);

            //设置下载参数
            currentParameter = new DownloadParameter()
            {
                //文件名 例: c:\123(1).flv
                FilePath = Path.Combine(Info.SaveDirectory.ToString(),
                                        title + ".mp4"),
                //文件URL
                Url = video,
                //代理服务器
                Proxy = Info.Proxy,
                //Cookie
                Cookies = cookies,
                //提取缓存
                ExtractCache        = Info.ExtractCache,
                ExtractCachePattern = "fla*.tmp"
            };

            //下载视频
            bool success = Network.DownloadFile(currentParameter, this.Info);

            if (!success)             //未出现错误即用户手动停止
            {
                return(false);
            }

            return(true);
        }
示例#9
0
        //下载视频
        public bool Download()
        {
            //开始下载
            delegates.TipText(new ParaTipText(this.Info, "正在分析视频地址"));
            try
            {
                //取得网页源文件
                string src = Network.GetHtmlSource(Info.Url, Encoding.UTF8, Info.Proxy);

                //去除乱码
                src = src.Replace(@"\u0026", "&");
                src = src.Replace("\\\"", "\"");
                for (int i = 0; i < 10; i++)
                {
                    src = src.Replace("%25", "%");
                }
                src = src.Replace("%3A", ":").Replace("%2F", "/")
                      .Replace("%3F", "?").Replace("%2C", ",").Replace("%3D", "=")
                      .Replace("%26", "&");

                //取得视频标题
                Regex  rTitle = new Regex(@"<meta name=""title"" content=""(?<title>.+?)"">");
                Match  mTitle = rTitle.Match(src);
                string title  = mTitle.Groups["title"].Value;

                Info.Title = title;
                //过滤非法字符
                title = Tools.InvalidCharacterFilter(title, "");

                //视频地址数组
                string[] videos = null;
                //清空地址
                Info.FilePath.Clear();

                //取得Flash参数
                Regex  rFlashVars = new Regex(@"flashvars=""(?<content>.+?)""");
                Match  mFlashVars = rFlashVars.Match(src);
                string flashvars  = mFlashVars.Groups["content"].Value;



                //取得清晰度列表
                Regex  rFmtList = new Regex(@"fmt_list=(?<fmt>.+?)&amp");
                Match  mFmtList = rFmtList.Match(flashvars);
                string fmtlist  = mFmtList.Groups["fmt"].Value;

                Regex           rFmts  = new Regex(@"(?<fmtid>\d+)/(?<fmtres>\d+x\d+)/\d+/\d+/\d+");
                MatchCollection mcFmts = rFmts.Matches(fmtlist);

                //分辨率列表
                var resolutions = new List <string>();
                //FMT列表
                var fmtids = new List <string>();
                //视频地址列表
                var videoUrls = new List <string>();

                foreach (Match mFmt in mcFmts)
                {
                    string describe = "";
                    //添加到FMT列表
                    fmtids.Add(mFmt.Groups["fmtid"].Value);
                    switch (mFmt.Groups["fmtid"].Value)
                    {
                        #region "FMT列表"
                    case "0":
                    case "5":
                    case "6":
                        describe = "FLV(H.263) MP3(64kbps)";
                        break;

                    case "34":
                    case "35":
                        describe = "FLV(H.263) AAC(128kbps)";
                        break;

                    case "13":
                    case "17":
                        describe = "3GP(mpeg4) AAC";
                        break;

                    case "18":
                        describe = "MPEG-4-AAC(H.264) AAC(128kbps)";
                        break;

                    case "22":
                    case "37":
                    case "38":
                        describe = "MPEG-4-AAC(H.264) AAC(152kbps)";
                        break;

                    case "82":
                    case "85":
                        describe = "3D MPEG-4-AAC(H.264) AAC(152kbps)";
                        break;

                    case "83":
                        describe = "3D MPEG-4-AAC(H.264) AAC(96kbps)";
                        break;

                    case "84":
                        describe = "3D MPEG-4-AAC(H.264) AAC(128kbps)";
                        break;

                    case "43":
                    case "46":
                        describe = "WebM(VP8) OGG(128kbps)";
                        break;

                    case "44":
                    case "45":
                        describe = "WebM(VP8) OGG(192kbps)";
                        break;

                    case "100":
                    case "101":
                    case "102":
                        describe = "3D WebM(VP8) OGG(192kbps)";
                        break;

                    default:
                        describe = "未知格式";
                        break;
                        #endregion
                    }
                    //添加到分辨率列表
                    resolutions.Add(mFmt.Groups["fmtres"].Value + " " + describe /*+ " [fmt=" + fmt.Groups["fmtid"].Value + "]" */);
                }

                //获取下载地址
                int             index1 = src.IndexOf("url_encoded_fmt_stream_map");
                int             index2 = src.IndexOf("<!-- begin watch-video-extra -->");
                string          urls   = src.Substring(index1, index2 - index1);
                Regex           rUrls  = new Regex(@"url=(?<url>http://.+?)&quality=");
                MatchCollection mUrls  = rUrls.Matches(urls);
                //添加到视频地址列表
                foreach (Match item in mUrls)
                {
                    videoUrls.Add(item.Groups["url"].Value);
                }


                //添加(FMT-清晰度)字典
                var dict = new Dictionary <string, string>();
                for (int i = 0; i < videoUrls.Count; i++)
                {
                    dict.Add(fmtids[i], resolutions[i]);
                }

                //用户选择清晰度(获取一个FMT值)
                string chosenFmt;
                if (Info.Settings.ContainsKey("FMT"))
                {
                    chosenFmt = Info.Settings["FMT"];
                }
                else
                {
                    chosenFmt            = ToolForm.CreateSingleSelectForm("您正在下载YouTube视频,请选择视频清晰度:", dict, "", Info.AutoAnswer, "youtube");
                    Info.Settings["FMT"] = chosenFmt;
                }

                //设置真实地址
                videos    = new string[1];
                videos[0] = videoUrls[fmtids.FindIndex(new Predicate <string>((s) => { if (chosenFmt.Equals(s))
                                                                                       {
                                                                                           return(true);
                                                                                       }
                                                                                       else
                                                                                       {
                                                                                           return(false);
                                                                                       } }))];

                //下载视频
                //确定视频共有几个段落
                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);
        }
示例#10
0
        /// <summary>
        /// 解析土豆视频
        /// </summary>
        /// <remarks>接受的AutoAnswer对象需要以<i>tudou</i>作为前缀</remarks>
        public ParseResult Parse(ParseRequest request)
        {
            ParseResult pr = new ParseResult();
            int         t;

            if (!int.TryParse(request.Id, out t))             //测试iid是否是真实的(应该为数字)
            {
                //取得土豆网页面源代码
                string tudousource = Network.GetHtmlSource("http://www.tudou.com/programs/view/" + request.Id + "/", Encoding.GetEncoding("GB2312"), request.Proxy);
                //取得iid列表
                Regex           rIid  = new Regex(@"(?<=iid(:| = ))\d+", RegexOptions.Singleline);
                MatchCollection mIids = rIid.Matches(tudousource);
                List <string>   iids  = new List <string>();
                foreach (Match mIid in mIids)
                {
                    iids.Add(mIid.Value);
                }
                //取得icode列表
                Regex           rIcode  = new Regex(@"(?<=icode(:| = )(""|'))[\w\-]+", RegexOptions.Singleline);
                MatchCollection mIcodes = rIcode.Matches(tudousource);
                List <string>   icodes  = new List <string>();
                foreach (Match mIcode in mIcodes)
                {
                    icodes.Add(mIcode.Value);
                }
                //取得标题列表
                Regex           rKw  = new Regex(@"(?<=kw(:| = )(""|')).+?(?=(""|'))", RegexOptions.Singleline);
                MatchCollection mKws = rKw.Matches(tudousource);
                List <string>   kws  = new List <string>();
                foreach (Match mKw in mKws)
                {
                    kws.Add(mKw.Value);
                }

                //检查需要的iid
                for (int i = 0; i < icodes.Count; i++)
                {
                    if (request.Id.Equals(icodes[i]))
                    {
                        request.Id = iids[i];
                        pr.SpecificResult["icode"] = icodes[i];
                        pr.SpecificResult["title"] = kws[i];
                        break;
                    }
                }
            }
            pr.SpecificResult["iid"] = request.Id;

            //string xmlurl = @"http://v2.tudou.com/v?st=1%2C2%2C3%2C4%2C99&it=" + request.Id + "&pw=" + request.Password;
            string xmlurl = @"http://v2.tudou.com/f?sender=pepper&v=4.2.2&sj=1&id=" + request.Id + "&sid=10000&r=6226";
            string xmldoc = Network.GetHtmlSource(xmlurl, Encoding.UTF8, request.Proxy);

            xmldoc = xmldoc.Replace("<a>", "").Replace("</a>", "").Replace("<b>", "").Replace("</b>", "");
            if (xmldoc.StartsWith("<f"))
            {
                xmldoc = "<v>" + xmldoc + "</v>";
            }
            //反序列化XML文档
            TudouVideo tudou;
            var        serializer = new XmlSerializer(typeof(TudouVideo));

            using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(xmldoc)))
            {
                tudou = (TudouVideo)serializer.Deserialize(ms);
            }

            //Regex rVideo = new Regex("<f [^>]+brt=\"(?<brt>\\d+)\">(?<url>[^<]+)</f>");
            //MatchCollection mcVideo = rVideo.Matches(xmldoc);

            //默认url
            string defaultUrl = "";

            //将 数字-清晰度 存入到字典中
            var resolutiondict = new Dictionary <string, string>();

            resolutiondict.Add("1", "流畅");
            resolutiondict.Add("2", "清晰");
            resolutiondict.Add("3", "高清");
            resolutiondict.Add("4", "超清");
            resolutiondict.Add("99", "原画");

            //将 清晰度-地址 存入到字典中
            var videodict = new Dictionary <string, string>();

            //foreach (Match item in mcVideo)
            foreach (var info in tudou.videos)
            {
                string brt = info.brt ?? "1";              // item.Groups["brt"].Value;
                string url = info.address;                 // item.Groups["url"].Value;
                if (string.IsNullOrEmpty(defaultUrl))
                {
                    defaultUrl = url;
                }
                brt = resolutiondict[brt];
                if (!videodict.ContainsValue(brt))                 //不覆盖已有的 清晰度-地址 对
                {
                    videodict.Add(url, brt);
                }
            }

            //自动应答
            if (request.AutoAnswers != null && request.AutoAnswers.Count > 0)
            {
                string answer;
                foreach (var item in request.AutoAnswers)
                {
                    if (item.Prefix == "tudou")
                    {
                        if (resolutiondict.ContainsKey(item.Identify))                    //如果自动应答设置中有"1"/"2"/"3"/"99"
                        {
                            answer = resolutiondict[item.Identify];                       //取得描述(如"流畅 256P")
                            foreach (var u in videodict.Keys)                             //从字典中查找描述信息所属的URL
                            {
                                if (videodict[u].Equals(answer))
                                {
                                    pr.Items.Add(new ParseResultItem(u));
                                    return(pr);
                                }
                            }
                        }
                    }
                }
            }

            string urladdress;

            //只在视频清晰度数量多余1个时进行选择
            if (videodict.Count > 1)
            {
                urladdress = ToolForm.CreateSingleSelectForm("请选择视频清晰度:", videodict, defaultUrl, request.AutoAnswers, "tudou");
            }
            else             //如果只有一个清晰度,不进行选择
            {
                urladdress = defaultUrl;
            }

            pr.Items.Add(new ParseResultItem(urladdress));
            pr.Items[0].Information.Add("order", "1");
            //写入视频时长
            pr.Items[0].Information.Add("length", tudou.time);
            pr.SpecificResult.Add("totallength", tudou.time);
            return(pr);
        }
示例#11
0
        /// <summary>
        /// 解析土豆视频
        /// </summary>
        /// <remarks>接受的AutoAnswer对象需要以<i>tudou</i>作为前缀</remarks>
        public ParseResult Parse(ParseRequest request)
        {
            ParseResult pr = new ParseResult();
            int         t;

            if (!int.TryParse(request.Id, out t))           //测试iid是否是真实的(应该为数字)
            {
                //取得土豆网页面源代码
                string tudousource = Network.GetHtmlSource("http://www.tudou.com/programs/view/" + request.Id + "/", Encoding.GetEncoding("GB2312"), request.Proxy);
                //取得iid列表
                Regex           rIid  = new Regex(@"(?<=iid(:| = ))\d+", RegexOptions.Singleline);
                MatchCollection mIids = rIid.Matches(tudousource);
                List <string>   iids  = new List <string>();
                foreach (Match mIid in mIids)
                {
                    iids.Add(mIid.Value);
                }
                //取得icode列表
                Regex           rIcode  = new Regex(@"(?<=icode(:| = )(""|'))[\w\-]+", RegexOptions.Singleline);
                MatchCollection mIcodes = rIcode.Matches(tudousource);
                List <string>   icodes  = new List <string>();
                foreach (Match mIcode in mIcodes)
                {
                    icodes.Add(mIcode.Value);
                }
                //取得标题列表
                Regex           rKw  = new Regex(@"(?<=kw(:| = )(""|')).+?(?=(""|'))", RegexOptions.Singleline);
                MatchCollection mKws = rKw.Matches(tudousource);
                List <string>   kws  = new List <string>();
                foreach (Match mKw in mKws)
                {
                    kws.Add(mKw.Value);
                }

                //检查需要的iid
                for (int i = 0; i < icodes.Count; i++)
                {
                    if (request.Id.Equals(icodes[i]))
                    {
                        request.Id = iids[i];
                        pr.SpecificResult["icode"] = icodes[i];
                        pr.SpecificResult["title"] = kws[i];
                        break;
                    }
                }
            }
            pr.SpecificResult["iid"] = request.Id;

            string          xmlurl  = @"http://v2.tudou.com/v?st=1%2C2%2C3%2C4%2C99&it=" + request.Id + "&pw=" + request.Password;
            string          xmldoc  = Network.GetHtmlSource(xmlurl, Encoding.UTF8, request.Proxy);
            Regex           rVideo  = new Regex("<f [^>]+brt=\"(?<brt>\\d+)\">(?<url>[^<]+)</f>");
            MatchCollection mcVideo = rVideo.Matches(xmldoc);

            //默认url
            string defaultUrl = "";

            //将 数字-清晰度 存入到字典中
            var resolutiondict = new Dictionary <string, string>();

            resolutiondict.Add("1", "流畅 256P");
            resolutiondict.Add("2", "清晰 360P");
            resolutiondict.Add("3", "高清 720P");
            resolutiondict.Add("99", "原画");

            //将 清晰度-地址 存入到字典中
            var videodict = new Dictionary <string, string>();

            foreach (Match item in mcVideo)
            {
                string brt = item.Groups["brt"].Value;
                string url = item.Groups["url"].Value;
                if (string.IsNullOrEmpty(defaultUrl))
                {
                    defaultUrl = url;
                }
                if (resolutiondict.ContainsKey(brt))
                {
                    brt = resolutiondict[brt];
                }
                if (!videodict.ContainsValue(brt))                 //不覆盖已有的 清晰度-地址 对
                {
                    videodict.Add(url, brt);
                }
            }

            //自动应答
            if (request.AutoAnswers.Count > 0)
            {
                string answer;
                foreach (var item in request.AutoAnswers)
                {
                    if (item.Prefix == "tudou")
                    {
                        if (resolutiondict.ContainsKey(item.Identify))                    //如果自动应答设置中有"1"/"2"/"3"/"99"
                        {
                            answer = resolutiondict[item.Identify];                       //取得描述(如"流畅 256P")
                            foreach (var u in videodict.Keys)                             //从字典中查找描述信息所属的URL
                            {
                                if (videodict[u].Equals(answer))
                                {
                                    pr.Items.Add(new ParseResultItem(u));
                                    return(pr);
                                }
                            }
                        }
                    }
                }
            }

            string urladdress;

            //只在视频清晰度数量多余1个时进行选择
            if (videodict.Count > 1)
            {
                urladdress = ToolForm.CreateSingleSelectForm("请选择视频清晰度:", videodict, defaultUrl, request.AutoAnswers, "tudou");
            }
            else             //如果只有一个清晰度,不进行选择
            {
                urladdress = defaultUrl;
            }

            pr.Items.Add(new ParseResultItem(urladdress));
            return(pr);
        }
示例#12
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));
        }
示例#13
0
        private void AddForm(string addForm)
        {
            switch (addForm)
            {
            case "login":
                panel1.Controls.Clear();
                Login l = new Login(userType);
                panel1.Controls.Add(l);
                break;

            case "MainForm":
                panel1.Controls.Clear();
                MainInfor mi = new MainInfor(userType);
                panel1.Controls.Add(mi);
                break;

            case "Label_Syn":
                panel1.Controls.Clear();
                SynForm syn = new SynForm(userType);
                panel1.Controls.Add(syn);
                break;

            case "Label_Checking":
                panel1.Controls.Clear();
                RevpreForm RF = new RevpreForm(userType);
                panel1.Controls.Add(RF);
                break;

            case "Label_Batch":
                panel1.Controls.Clear();
                BatchForm bf = new BatchForm(userType);
                panel1.Controls.Add(bf);
                break;

            case "Label_print":
                panel1.Controls.Clear();
                PrintForm pf = new PrintForm(userType);
                panel1.Controls.Add(pf);
                break;

            case "Label_Check":
                panel1.Controls.Clear();
                LabelCheck lc = new LabelCheck(userType);
                panel1.Controls.Add(lc);
                break;

            case "Label_Tool":
                panel1.Controls.Clear();
                ToolForm tf = new ToolForm(userType);
                panel1.Controls.Add(tf);
                break;

            case "BatchRule":
                panel1.Controls.Clear();
                BatchRule br = new BatchRule(userType);
                panel1.Controls.Add(br);
                break;

            case "DrugHelp":
                panel1.Controls.Clear();
                DrugHelp dh = new DrugHelp(userType);
                panel1.Controls.Add(dh);
                break;

            case "DwardHelp":
                panel1.Controls.Clear();
                DwardHelp ddh = new DwardHelp(userType);
                panel1.Controls.Add(ddh);
                break;

            case "BaiYaoCheck":
                panel1.Controls.Clear();
                BaiYao BY = new BaiYao(userType);
                panel1.Controls.Add(BY);
                break;

            case "PaiYaoCheck":
                panel1.Controls.Clear();
                QiTa QT = new QiTa(userType);
                panel1.Controls.Add(QT);
                break;

            //case "CheckForm":
            //    ChangeColor(label15.Text);
            //    panel1.Controls.Clear();
            //    LabelCheck lc = new LabelCheck();
            //    panel1.Controls.Add(lc);
            //    break;
            //case "ScanPreForm":
            //    ChangeColor(label7.Text);
            //    panel1.Controls.Clear();
            //    ScanPre spe = new ScanPre();
            //    panel1.Controls.Add(spe);
            //    break;
            //case "LabelCXForm":
            //    ChangeColor(label8.Text);
            //    panel1.Controls.Clear();
            //    LabelCX lcx = new LabelCX();
            //    panel1.Controls.Add(lcx);
            //    break;
            //case "ToolsForm":
            //    ChangeColor(label5.Text);
            //    Tool t = new Tool();
            //    panel1.Controls.Add(t);
            //    break;
            //case "ProblemForm":
            //    ChangeColor(label10.Text);
            //    panel1.Controls.Clear();
            //    Problem pb = new Problem();
            //    panel1.Controls.Add(pb);
            //    break;
            //case "EdtionForm":
            //    ChangeColor(label9.Text);
            //    panel1.Controls.Clear();
            //    Edition ed = new Edition();
            //    panel1.Controls.Add(ed);
            //    break;
            default: break;
            }
        }
示例#14
0
        public bool Download()
        {
            //开始下载
            delegates.TipText(new ParaTipText(this.Info, "正在分析動畫下載位址"));

            Regex regChapter = new Regex("http://.+/v/[^-]+-(?<param1>[0-9])-(?<param2>[0-9][0-9]?).html");
            Match linkname   = regChapter.Match(Info.Url);

            //要下载的Url列表
            var subUrls = new Collection <string>();

            if (linkname.Success == false)
            {
                //尼玛是整部

                regChapter = new Regex("http://www.dm530.com/show/(?<value>[^.]+).html");
                linkname   = regChapter.Match(Info.Url);

                //取得Url源文件
                string src = Network.GetHtmlSource(Info.Url, Encoding.GetEncoding("GBK"), Info.Proxy);

                //填充字典
                var dict = new Dictionary <string, string>();

                int chapter_start = src.IndexOf("class=\"on\"");
                while (chapter_start > 0)
                {
                    int chapter_end = src.IndexOf("class=\"on\"", chapter_start + 1);
                    if (chapter_end < 0)
                    {
                        break;
                    }

                    string sub_src = src.Substring(chapter_start, chapter_end - chapter_start);

                    regChapter = new Regex("class=\"on\">(?<source_name>[^<]+)</li>");
                    Match item = regChapter.Match(sub_src);
                    if (item.Success == false)
                    {
                        break;
                    }

                    string souce_name = item.Groups["source_name"].Value;

                    string chapter = "title='(?<chapter_name>[^']+)' href='(?<link_url>[^']+)'";
                    regChapter = new Regex(chapter);
                    item       = regChapter.Match(sub_src);

                    while (item.Success)
                    {
                        string url          = "http://www.dm530.com" + item.Groups["link_url"].Value;
                        string chapter_name = souce_name + "-" + item.Groups["chapter_name"].Value;
                        dict.Add(url.Trim(), chapter_name);

                        // first match is "hello world"!! but this turns out to be an infinite loop
                        item = item.NextMatch();
                    }

                    chapter_start = chapter_end;
                }

                if (dict.Count <= 0)
                {
                    return(false);
                }

                //选择下载哪部漫画
                subUrls = ToolForm.CreateMultiSelectForm(dict, Info.AutoAnswer, "dm530");
                //如果用户没有选择任何章节
                if (subUrls.Count == 0)
                {
                    return(false);
                }
            }
            else
            {
                subUrls.Add(Info.Url);
            }

            Info.PartCount   = subUrls.Count;
            Info.CurrentPart = 0;
            foreach (string url in subUrls)
            {
                //提示更换新Part
                delegates.NewPart(new ParaNewPart(this.Info, Info.CurrentPart));

                regChapter = new Regex("http://.+/[^-]+-(?<param1>[0-9])-(?<param2>[0-9][0-9]?).html");
                Match urlname = regChapter.Match(url);

                string chaper_src = Network.GetHtmlSource(url, Encoding.GetEncoding("GBK"), Info.Proxy);

                string title_name = "NoName";
                regChapter = new Regex("<meta name=\"title\" content=\"(?<title_name>[^\"]+)\">");
                Match item = regChapter.Match(chaper_src);
                if (item.Success)
                {
                    title_name = item.Groups["title_name"].Value;
                }
                regChapter = new Regex("/playdata/(?<js_name>[^\"]+)");
                item       = regChapter.Match(chaper_src);
                if (item.Success == false)
                {
                    continue;
                }

                string js_url = "http://www.dm530.com/playdata/" + item.Groups["js_name"].Value;

                string js_src = Network.GetHtmlSource(js_url, Encoding.GetEncoding("GBK"), Info.Proxy);

                int json_start = js_src.IndexOf("[");
                int json_end   = js_src.LastIndexOf("]");
                js_src = js_src.Substring(json_start, json_end - json_start + 1);

                System.IO.File.WriteAllText(@"d:\dm530.txt", js_src);

                //取得视频信息
                List <Dm530Video> chapterinfo = new List <Dm530Video>();

                JArray jarr     = JArray.Parse(js_src);
                int    videoidx = -1;
                foreach (var jitem in jarr.Children())
                {
                    foreach (var jsubitem in jitem.Children())
                    {
                        if (jsubitem.Type == JTokenType.String)
                        {
                            Dm530Video video = new Dm530Video();
                            video.souce = jsubitem.ToString();
                            videoidx++;
                            chapterinfo.Add(video);
                        }
                        else if (jsubitem.Type == JTokenType.Array)
                        {
                            chapterinfo [videoidx].info = jsubitem.ToObject <List <string> >();
                        }
                    }
                }

                int param1 = int.Parse(urlname.Groups["param1"].Value);
                int param2 = int.Parse(urlname.Groups["param2"].Value);

                DownloadChapter(chapterinfo[param1].info[param2], title_name);
            }
            return(true);
        }
示例#15
0
        private string LoginApi(string url, string apiAddress, out CookieContainer loginPageCookieContainer)
        {
            string xmlSrc;
            var    LOGIN_PAGE = "https://secure.bilibili.com/login";
            //获取登录页Cookie
            var loginPageRequest = (HttpWebRequest)WebRequest.Create(LOGIN_PAGE);

            loginPageRequest.Proxy     = Info.Proxy;
            loginPageRequest.Referer   = @"http://www.bilibili.com/";
            loginPageRequest.UserAgent = @"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0";
            loginPageRequest.Accept    = @"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";

            string loginPageCookie;

            using (var resp = loginPageRequest.GetResponse())
            {
                loginPageCookieContainer = new CookieContainer();
                var sid = Regex.Match(resp.Headers["Set-Cookie"], @"(?<=sid=)\w+").Value;
                loginPageCookieContainer.Add(new Cookie("sid", sid, "/", ".bilibili.com"));
                loginPageCookie = loginPageCookieContainer.GetCookieHeader(new Uri(LOGIN_PAGE));
            }
            //获取验证码图片
            var loginInfo = new UserLoginInfo();

            if (Info.BasePlugin.Configuration.ContainsKey("Username"))
            {
                loginInfo.Username = Encoding.UTF8.GetString(Convert.FromBase64String(Info.BasePlugin.Configuration["Username"]));
            }
            if (Info.BasePlugin.Configuration.ContainsKey("Password"))
            {
                loginInfo.Password = Encoding.UTF8.GetString(Convert.FromBase64String(Info.BasePlugin.Configuration["Password"]));
            }
            if (Settings.ContainsKey("Username"))
            {
                loginInfo.Username = Settings["Username"];
            }
            if (Settings.ContainsKey("Password"))
            {
                loginInfo.Password = Settings["Password"];
            }

            var captchaUrl = @"https://secure.bilibili.com/captcha?r=" +
                             new Random(Environment.TickCount).NextDouble().ToString();
            var captchaFile   = Path.GetTempFileName() + ".png";
            var captchaClient = new WebClient {
                Proxy = Info.Proxy
            };

            captchaClient.Headers.Add(HttpRequestHeader.Cookie, loginPageCookie);
            captchaClient.DownloadFile(captchaUrl, captchaFile);
            loginInfo = ToolForm.CreateLoginForm(loginInfo, @"https://secure.bilibili.com/register", captchaFile);

            //保存到设置
            Settings["Username"] = loginInfo.Username;
            Settings["Password"] = loginInfo.Password;


            string postString = @"act=login&gourl=http%%3A%%2F%%2Fbilibili.com%%2F&userid=" + loginInfo.Username + "&pwd=" +
                                loginInfo.Password +
                                "&vdcode=" + loginInfo.Captcha.ToUpper() + "&keeptime=2592000";

            byte[] data = Encoding.UTF8.GetBytes(postString);

            var loginRequest = (HttpWebRequest)WebRequest.Create(@"https://secure.bilibili.com/login");

            loginRequest.Proxy           = Info.Proxy;
            loginRequest.Method          = "POST";
            loginRequest.Referer         = "https://secure.bilibili.com/login";
            loginRequest.ContentType     = "application/x-www-form-urlencoded";
            loginRequest.ContentLength   = data.Length;
            loginRequest.UserAgent       = "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0";
            loginRequest.Referer         = url;
            loginRequest.CookieContainer = loginPageCookieContainer;

            //发送POST数据
            using (var outstream = loginRequest.GetRequestStream())
            {
                outstream.Write(data, 0, data.Length);
                outstream.Flush();
            }
            //关闭请求
            loginRequest.GetResponse().Close();
            var cookies = loginRequest.CookieContainer.GetCookieHeader(new Uri(LOGIN_PAGE));

            var client = new WebClient {
                Proxy = Info.Proxy
            };

            client.Headers.Add(HttpRequestHeader.Cookie, cookies);

            var apiRequest = (HttpWebRequest)WebRequest.Create(apiAddress);

            apiRequest.Proxy = Info.Proxy;
            apiRequest.Headers.Add(HttpRequestHeader.Cookie, cookies);
            xmlSrc = Network.GetHtmlSource(apiRequest, Encoding.UTF8);
            return(xmlSrc);
        }
示例#16
0
        /// <summary>
        /// 下载视频
        /// </summary>
        public override bool Download()
        {
            //开始下载
            TipText("正在分析视频地址");

            //修正井号
            Info.Url = Info.Url.ToLower().TrimEnd('#');
            //修正旧版URL
            Info.Url = Info.Url.Replace("bilibili.tv", "bilibili.com");
            Info.Url = Info.Url.Replace("bilibili.us", "bilibili.com");
            Info.Url = Info.Url.Replace("bilibili.smgbb.cn", "www.bilibili.com");
            Info.Url = Info.Url.Replace("bilibili.kankanews.com", "www.bilibili.com");

            //修正简写URL
            if (Regex.Match(Info.Url, @"^av\d{2,6}$").Success)
            {
                Info.Url = "http://www.bilibili.com/video/" + Info.Url + "/";
            }
            //修正index_1.html
            if (!Info.Url.EndsWith(".html"))
            {
                if (Info.Url.EndsWith("/"))
                {
                    Info.Url += "index_1.html";
                }
                else
                {
                    Info.Url += "/index_1.html";
                }
            }

            string url = Info.Url;
            //取得子页面文件名(例如"/video/av12345/index_123.html")
            //string suburl = Regex.Match(Info.Url, @"bilibili\.kankanews\.com(?<part>/video/av\d+/index_\d+\.html)").Groups["part"].Value;
            string suburl = Regex.Match(Info.Url, @"www\.bilibili\.com(?<part>/video/av\d+/index_\d+\.html)").Groups["part"].Value;
            //取得AV号和子编号
            //Match mAVNumber = Regex.Match(Info.Url, @"(?<av>av\d+)/index_(?<sub>\d+)\.html");
            Match mAVNumber = BilibiliPlugin.RegexBili.Match(Info.Url);

            if (!mAVNumber.Success)
            {
                mAVNumber = BilibiliPlugin.RegexAcg.Match(Info.Url);
            }
            Settings["AVNumber"]    = mAVNumber.Groups["id"].Value;
            Settings["AVSubNumber"] = mAVNumber.Groups["page"].Value;
            Settings["AVSubNumber"] = string.IsNullOrEmpty(Settings["AVSubNumber"]) ? "1" : Settings["AVSubNumber"];
            //设置自定义文件名
            Settings["CustomFileName"] = BilibiliPlugin.DefaultFileNameFormat;
            if (Info.BasePlugin.Configuration.ContainsKey("CustomFileName"))
            {
                Settings["CustomFileName"] = Info.BasePlugin.Configuration["CustomFileName"];
            }

            //是否通过【自动应答】禁用对话框
            bool disableDialog = AutoAnswer.IsInAutoAnswers(Info.AutoAnswer, "bilibili", "auto");

            //视频地址数组
            string[] videos = null;

            try
            {
                //解析关联项需要同时满足的条件:
                //1.这个任务不是被其他任务所添加的
                //2.用户设置了“解析关联项”
                if (!Info.IsBeAdded || Info.ParseRelated)
                {
                    //取得网页源文件
                    string src      = Network.GetHtmlSource(url, Encoding.UTF8, Info.Proxy);
                    string subtitle = "";
                    //取得子标题
                    Regex           rSubTitle  = new Regex(@"<option value='(?<part>.+?\.html)'( selected)?>(?<content>.+?)</option>");
                    MatchCollection mSubTitles = rSubTitle.Matches(src);

                    //如果存在下拉列表框
                    if (mSubTitles.Count > 0)
                    {
                        //确定当前视频的子标题
                        foreach (Match item in mSubTitles)
                        {
                            if (suburl == item.Groups["part"].Value)
                            {
                                subtitle = item.Groups["content"].Value;
                                break;
                            }
                        }

                        //准备(地址-标题)字典
                        var dict = new Dictionary <string, string>();
                        foreach (Match item in mSubTitles)
                        {
                            if (suburl != item.Groups["part"].Value)
                            {
                                dict.Add(url.Replace(suburl, item.Groups["part"].Value),
                                         item.Groups["content"].Value);
                            }
                        }
                        //用户选择任务
                        var ba = new Collection <string>();
                        if (!disableDialog)
                        {
                            ba = ToolForm.CreateMultiSelectForm(dict, Info.AutoAnswer, "bilibili");
                        }
                        //根据用户选择新建任务
                        foreach (string u in ba)
                        {
                            NewTask(u);
                        }
                    }
                }

                //获取视频信息API
                var ts         = Convert.ToInt64((DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0)).TotalMilliseconds);
                var apiAddress = string.Format(@"http://api.bilibili.cn/view?appkey={0}&ts={1}&id={2}&page={3}",
                                               BilibiliPlugin.AppKey,
                                               ts,
                                               Settings["AVNumber"],
                                               Settings["AVSubNumber"]);
                //AcDown所使用的AppKey是旧AppKey,权限比新申请的要高,而且不需要加上sign验证
                //如果将来要使用sign验证的话可以使用下面的代码来算出sign
                //但是这段代码目前加上后还是不能正确工作的状态,不知道为什么
                //Tools.GetStringHash("appkey=" + BilibiliPlugin.AppKey +
                //					"&id=" + Settings["AVNumber"] +
                //					"&page=" + Settings["AVSubNumber"] +
                //					"&ts=" + ts +
                //					BilibiliPlugin.AppSecret));
                var webrequest = (HttpWebRequest)WebRequest.Create(apiAddress);
                webrequest.Accept    = @"application/json";
                webrequest.UserAgent = "AcDown/" + Application.ProductVersion + " ([email protected])";
                webrequest.Proxy     = Info.Proxy;
                var viewSrc = Network.GetHtmlSource(webrequest, Encoding.UTF8);
                //登录获取API结果
                if (viewSrc.Contains("no perm error"))
                {
                    viewSrc = LoginApi(url, apiAddress, out m_cookieContainer);
                }

                AvInfo avInfo;
                try
                {
                    //解析JSON
                    avInfo = JsonConvert.DeserializeObject <AvInfo>(viewSrc);
                }
                catch
                {
                    //由于接口原因,有时候虽然请求了json但是会返回XML格式(呃
                    var viewDoc = new XmlDocument();
                    viewDoc.LoadXml(viewSrc);
                    avInfo          = new AvInfo();
                    avInfo.title    = viewDoc.SelectSingleNode(@"/info/title").InnerText.Replace("&amp;", "&");
                    avInfo.partname = viewDoc.SelectSingleNode(@"/info/partname").InnerText.Replace("&amp;", "&");
                    avInfo.cid      = Regex.Match(viewSrc, @"(?<=\<cid\>)\d+(?=\</cid\>)", RegexOptions.IgnoreCase).Value;
                }

                //视频标题和子标题
                string title  = avInfo.title ?? "";
                string stitle = avInfo.partname ?? "";

                if (String.IsNullOrEmpty(stitle))
                {
                    Info.Title = title;
                    stitle     = title;
                }
                else
                {
                    Info.Title = title + " - " + stitle;
                }
                //过滤非法字符
                title  = Tools.InvalidCharacterFilter(title, "");
                stitle = Tools.InvalidCharacterFilter(stitle, "");

                //清空地址
                Info.FilePath.Clear();
                Info.SubFilePath.Clear();

                //CID
                Settings["chatid"] = avInfo.cid;

                //下载弹幕
                DownloadComment(title, stitle, Settings["chatid"]);

                //解析器的解析结果
                ParseResult pr = null;

                //如果允许下载视频
                if ((Info.DownloadTypes & DownloadType.Video) != 0)
                {
                    //var playurlSrc = Network.GetHtmlSource(@"http://interface.bilibili.tv/playurl?otype=xml&cid=" + Settings["chatid"] + "&type=flv", Encoding.UTF8);
                    //var playurlDoc = new XmlDocument();
                    //playurlDoc.LoadXml(playurlSrc);

                    //获得视频列表
                    var prRequest = new ParseRequest()
                    {
                        Id              = Settings["chatid"],
                        Proxy           = Info.Proxy,
                        AutoAnswers     = Info.AutoAnswer,
                        CookieContainer = m_cookieContainer
                    };
                    pr     = new BilibiliInterfaceParser().Parse(prRequest);
                    videos = pr.ToArray();

                    //支持导出列表
                    if (videos != null)
                    {
                        StringBuilder sb = new StringBuilder(videos.Length * 2);
                        foreach (string item in videos)
                        {
                            sb.Append(item);
                            sb.Append("|");
                        }
                        if (Settings.ContainsKey("ExportUrl"))
                        {
                            Settings["ExportUrl"] = sb.ToString();
                        }
                        else
                        {
                            Settings.Add("ExportUrl", sb.ToString());
                        }
                    }

                    //下载视频
                    //确定视频共有几个段落
                    Info.PartCount = videos.Length;

                    //------------分段落下载------------
                    for (int i = 0; i < Info.PartCount; i++)
                    {
                        Info.CurrentPart = i + 1;

                        //取得文件后缀名
                        string ext = Tools.GetExtension(videos[i]);
                        if (string.IsNullOrEmpty(ext))
                        {
                            if (string.IsNullOrEmpty(Path.GetExtension(videos[i])))
                            {
                                ext = ".flv";
                            }
                            else
                            {
                                ext = Path.GetExtension(videos[i]);
                            }
                        }
                        if (ext == ".hlv")
                        {
                            ext = ".flv";
                        }

                        //设置文件名
                        var    renamehelper = new CustomFileNameHelper();
                        string filename     = renamehelper.CombineFileName(Settings["CustomFileName"],
                                                                           title, stitle, Info.PartCount == 1 ? "" : Info.CurrentPart.ToString(),
                                                                           ext.Replace(".", ""), Settings["AVNumber"], Settings["AVSubNumber"]);
                        filename = Path.Combine(Info.SaveDirectory.ToString(), filename);

                        //生成父文件夹
                        if (!Directory.Exists(Path.GetDirectoryName(filename)))
                        {
                            Directory.CreateDirectory(Path.GetDirectoryName(filename));
                        }

                        //设置当前DownloadParameter
                        currentParameter = new DownloadParameter()
                        {
                            //文件名 例: c:\123(1).flv
                            FilePath = filename,
                            //文件URL
                            Url = videos[i],
                            //代理服务器
                            Proxy = Info.Proxy,
                            //提取缓存
                            ExtractCache        = Info.ExtractCache,
                            ExtractCachePattern = "fla*.tmp"
                        };

                        //添加文件路径到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                         //下载文件时出现错误
                        {
                            //如果此任务由一个视频组成,则报错(下载失败)
                            if (Info.PartCount == 1)
                            {
                                throw;
                            }
                            else                             //否则继续下载,设置“部分失败”状态
                            {
                                Info.PartialFinished        = true;
                                Info.PartialFinishedDetail += "\r\n文件: " + currentParameter.Url + " 下载失败";
                            }
                        }
                    }            //end for
                }                //end 判断是否下载视频


                //如果插件设置中没有GenerateAcPlay项,或此项设置为true则生成.acplay快捷方式
                if (!Info.BasePlugin.Configuration.ContainsKey("GenerateAcPlay") ||
                    Info.BasePlugin.Configuration["GenerateAcPlay"] == "true")
                {
                    //生成AcPlay文件
                    string acplay = GenerateAcplayConfig(pr, title, stitle);
                    //支持AcPlay直接播放
                    Settings["AcPlay"] = acplay;
                }

                //生成视频自动合并参数
                if (Info.FilePath.Count > 1 && !Info.PartialFinished)
                {
                    Info.Settings.Remove("VideoCombine");
                    var arg = new StringBuilder();
                    foreach (var item in Info.FilePath)
                    {
                        arg.Append(item);
                        arg.Append("|");
                    }

                    var    renamehelper = new CustomFileNameHelper();
                    string filename     = renamehelper.CombineFileName(Settings["CustomFileName"],
                                                                       title, stitle, "",
                                                                       "mp4", Info.Settings["AVNumber"], Info.Settings["AVSubNumber"]);
                    filename = Path.Combine(Info.SaveDirectory.ToString(), filename);

                    arg.Append(filename);
                    Info.Settings["VideoCombine"] = arg.ToString();
                }
            }
            catch
            {
                Settings["user"]     = "";
                Settings["password"] = "";
                throw;
            }

            return(true);
        }
示例#17
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);
        }
示例#18
0
        //下载视频
        public bool Download()
        {
            //开始下载
            delegates.TipText(new ParaTipText(this.Info, "正在分析视频地址"));

            string url = Info.Url;

            //视频地址数组
            string[] videos = null;

            try
            {
                //取得网页源文件
                string src = Network.GetHtmlSource(url, Encoding.UTF8, Info.Proxy);

                //视频id
                string id = "";
                //type值
                string type = "";
                //player id
                string playerId = "";
                //选择的视频(下拉列表)
                int selectedvideo = 0;

                //清空地址
                Info.FilePath.Clear();

                //取得视频标题
                Regex rTitle = new Regex(@"<title>(?<title>.*)</title>");
                Match mTitle = rTitle.Match(src);

                //分析id和视频存放站点(type)
                //取得"mplayer块的源代码
                Regex  rEmbed   = new Regex(@"<div id=""mplayer"">.+?</embed>", RegexOptions.Singleline);
                Match  mEmbed   = rEmbed.Match(src);
                string embedSrc = mEmbed.Value;

                //取得id值
                Regex           rId  = new Regex(@"\w+id=(?<id>\w+)");
                MatchCollection mIds = rId.Matches(embedSrc);

                //取得type值
                Regex           rType  = new Regex(@"type=(?<type>\w+)");
                MatchCollection mTypes = rType.Matches(embedSrc);
                //取得PlayerID值
                Regex rPlayerid = new Regex(@"<li>(?<playerid>content.+?)</li>");
                Match mPlayerid = rPlayerid.Match(embedSrc);
                playerId = mPlayerid.Groups["playerid"].Value;
                //取得所有子标题
                Regex           rSubTitle  = new Regex(@"\|(?<subtitle>.*?)(\*\*|</li>)");
                MatchCollection mSubTitles = rSubTitle.Matches(embedSrc);
                Match           mId        = null;
                Match           mType      = null;
                Match           mSubTitle  = null;

                if (mIds.Count > 1)                 //如果数量大于一个
                {
                    //定义字典
                    var dict = new Dictionary <string, string>();
                    for (int i = 0; i < mIds.Count; i++)
                    {
                        dict.Add(i.ToString(), (i + 1).ToString() + "、" + mSubTitles[i].Groups["subtitle"].Value);
                    }
                    //用户选择下载哪一个视频
                    selectedvideo = int.Parse(ToolForm.CreateSingleSelectForm("请选择视频:", dict, "", Info.AutoAnswer, "tucao"));
                    mId           = mIds[selectedvideo];
                    mType         = mTypes[selectedvideo];
                    mSubTitle     = mSubTitles[selectedvideo];
                }
                else
                {
                    mId       = mIds[0];
                    mType     = mTypes[0];
                    mSubTitle = mSubTitles[0];
                }

                //设置标题
                string title    = mTitle.Groups["title"].Value.Replace("- 吐槽 - tucao.cc", "");
                string subTitle = mSubTitle.Groups["subtitle"].Value;
                if (!string.IsNullOrEmpty(subTitle))                 //如果存在子标题(视频为合集)
                {
                    //更改标题
                    title = title + " - " + subTitle;
                    //更改URL防止hash时出错
                    Info.Url = Info.Url + "#" + subTitle;
                }
                //过滤非法字符
                Info.Title = title;
                title      = Tools.InvalidCharacterFilter(title, "");

                //取得ID
                id = mId.Groups["id"].Value;
                //取得type值
                type = mType.Groups["type"].Value;

                DownloadSubtitleType downsub = Info.DownSub;
                //如果不是“仅下载字幕”
                if (downsub != DownloadSubtitleType.DownloadSubtitleOnly)
                {
                    //检查外链
                    switch (type)
                    {
                    case "qq":                             //QQ视频
                        //解析视频
                        QQVideoParser parserQQ = new QQVideoParser();
                        videos = parserQQ.Parse(new ParseRequest()
                        {
                            Id = id, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer
                        }).ToArray();
                        break;

                    case "youku":                             //优酷视频
                        //解析视频
                        YoukuParser parserYouKu = new YoukuParser();
                        videos = parserYouKu.Parse(new ParseRequest()
                        {
                            Id = id, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer
                        }).ToArray();
                        break;

                    case "tudou":                             //土豆视频
                        //解析视频
                        TudouParser parserTudou = new TudouParser();
                        videos = parserTudou.Parse(new ParseRequest()
                        {
                            Id = id, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer
                        }).ToArray();
                        break;

                    case "sina":                             //新浪视频
                        SinaVideoParser parserSina = new SinaVideoParser();
                        videos = parserSina.Parse(new ParseRequest()
                        {
                            Id = id, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer
                        }).ToArray();
                        break;
                    }

                    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 (string.IsNullOrEmpty(ext))
                        {
                            if (string.IsNullOrEmpty(Path.GetExtension(videos[i])))
                            {
                                ext = ".flv";
                            }
                            else
                            {
                                ext = Path.GetExtension(videos[i]);
                            }
                        }
                        if (ext == ".hlv")
                        {
                            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;
                        //添加断点续传段
                        //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
                }
                //下载弹幕
                if ((downsub != DownloadSubtitleType.DontDownloadSubtitle) && !string.IsNullOrEmpty(playerId))
                {
                    //----------下载字幕-----------
                    delegates.TipText(new ParaTipText(this.Info, "正在下载字幕文件"));
                    //字幕文件(on)地址
                    string subfile = Path.Combine(Info.SaveDirectory.ToString(), title + ".xml");
                    Info.SubFilePath.Add(subfile);
                    //取得字幕文件(on)地址
                    string subUrl = "http://www.tucao.cc/index.php?m=comment&c=mukio&a=init&type=" + type + "&playerID=" + playerId + "~" + selectedvideo.ToString() + "&r=0.09502756828442216";
                    //下载字幕文件
                    try
                    {
                        Network.DownloadFile(new DownloadParameter()
                        {
                            Url      = subUrl,
                            FilePath = subfile,
                            Proxy    = Info.Proxy
                        });
                    }
                    catch
                    {
                        Info.PartialFinished        = true;
                        Info.PartialFinishedDetail += "\r\n弹幕文件文件下载失败";
                    }
                }                // end 下载弹幕xml
            }
            catch (Exception ex)
            {
                throw ex;
            }            //end try

            //下载成功完成
            return(true);
        }
示例#19
0
        public bool Download()
        {
            //开始下载
            delegates.TipText(new ParaTipText(this.Info, "正在分析漫画地址"));
            if (currentParameter != null)
            {
                //将停止flag设置为true
                currentParameter.IsStop = false;
            }
            try
            {
                //取得Url源文件
                string src = Network.GetHtmlSource(Info.Url, Encoding.GetEncoding("UTF-8"), Info.Proxy);
                //要下载的Url列表
                var   subUrls    = new Collection <string>();
                Regex regChapter = new Regex("\"chapters\">[\\s|\\S]*?<\\/div>");                 // 确定是整部漫画还是单独一话
                if (regChapter.Match(src).Success)
                {
                    //尼玛是整部漫画..
                    Match value = regChapter.Match(src);
                    src        = value.Value;
                    regChapter = new Regex("href=\"(?'link'[^>]+)\">(?'title'[^<]+)");
                    value      = regChapter.Match(src);
                    string title    = value.Groups["title"].Value.Trim();
                    int    MaxCount = ((int)float.Parse(Path.GetFileName(value.Groups["link"].Value)));

                    string baseLink = value.Groups["link"].Value;
                    baseLink = baseLink.Substring(0, baseLink.LastIndexOf('/') + 1);
                    title    = title.Replace(float.Parse(Path.GetFileName(value.Groups["link"].Value)).ToString(), "");
                    //填充字典
                    var dict = new Dictionary <string, string>();

                    while (MaxCount > 0)
                    {
                        dict.Add(baseLink + MaxCount.ToString(), title + MaxCount.ToString());
                        MaxCount--;
                    }
                    //选择下载哪部漫画
                    subUrls = ToolForm.CreateMultiSelectForm(dict, Info.AutoAnswer, "Goodmanga");
                    //如果用户没有选择任何章节
                    if (subUrls.Count == 0)
                    {
                        return(false);
                    }
                }
                else
                {
                    subUrls.Add(Info.Url);
                }
                Info.PartCount   = subUrls.Count;
                Info.CurrentPart = 0;
                foreach (string url in subUrls)
                {
                    Info.CurrentPart++;
                    //提示更换新Part
                    delegates.NewPart(new ParaNewPart(this.Info, Info.CurrentPart));
                    if (DownloadChapterComic(url) == false)
                    {
                        return(false);
                    }
                }
            }
            catch
            {
            }
            //下载成功完成
            currentParameter.DoneBytes = currentParameter.TotalLength;
            return(true);
        }
示例#20
0
        /// <summary>
        /// 解析土豆视频
        /// </summary>
        /// <remarks>接受的AutoAnswer对象需要以<i>tudou</i>作为前缀</remarks>
        public ParseResult Parse(ParseRequest request)
        {
            ParseResult pr = new ParseResult();
            int         t;

            if (!int.TryParse(request.Id, out t))           //测试iid是否是真实的(应该为数字)
            {
                //取得土豆网页面源代码
                string tudousource = Network.GetHtmlSource("http://www.tudou.com/programs/view/" + request.Id + "/", Encoding.GetEncoding("GB2312"), request.Proxy);
                //取得iid
                Regex r1 = new Regex(@"(I|i)id = (?<iid>\d.*)");
                Match m1 = r1.Match(tudousource);
                request.Id = m1.Groups["iid"].ToString();
            }

            string          xmlurl  = @"http://v2.tudou.com/v?st=1%2C2%2C3%2C4%2C99&it=" + request.Id + "&pw=" + request.Password;
            string          xmldoc  = Network.GetHtmlSource(xmlurl, Encoding.UTF8, request.Proxy);
            Regex           rVideo  = new Regex("<f [^>]+brt=\"(?<brt>\\d+)\">(?<url>[^<]+)</f>");
            MatchCollection mcVideo = rVideo.Matches(xmldoc);

            //默认url
            string defaultUrl = "";

            //将 数字-清晰度 存入到字典中
            var resolutiondict = new Dictionary <string, string>();

            resolutiondict.Add("1", "流畅 256P");
            resolutiondict.Add("2", "清晰 360P");
            resolutiondict.Add("3", "高清 720P");
            //resolutiondict.Add("4", "高清 1080P");
            resolutiondict.Add("99", "原画");

            //将 清晰度-地址 存入到字典中
            var videodict = new Dictionary <string, string>();

            foreach (Match item in mcVideo)
            {
                string brt = item.Groups["brt"].Value;
                string url = item.Groups["url"].Value;
                if (string.IsNullOrEmpty(defaultUrl))
                {
                    defaultUrl = url;
                }
                if (resolutiondict.ContainsKey(brt))
                {
                    brt = resolutiondict[brt];
                }
                if (!videodict.ContainsValue(brt))                 //不覆盖已有的 清晰度-地址 对
                {
                    videodict.Add(url, brt);
                }
            }

            //自动应答
            if (request.AutoAnswers.Count > 0)
            {
                string answer;
                foreach (var item in request.AutoAnswers)
                {
                    if (item.Prefix == "tudou")
                    {
                        if (resolutiondict.ContainsKey(item.Identify))                    //如果自动应答设置中有"1"/"2"/"3"/"99"
                        {
                            answer = resolutiondict[item.Identify];                       //取得描述(如"流畅 256P")
                            foreach (var u in videodict.Keys)                             //从字典中查找描述信息所属的URL
                            {
                                if (videodict[u].Equals(answer))
                                {
                                    pr.Items.Add(new ParseResultItem(new Uri(u)));
                                    return(pr);
                                }
                            }
                        }
                    }
                }
            }

            string urladdress;

            //只在视频清晰度数量多余1个时进行选择
            if (videodict.Count > 1)
            {
                urladdress = ToolForm.CreateSingleSelectForm("请选择视频清晰度:", videodict, defaultUrl, request.AutoAnswers, "tudou");

                //DEBUG
                //全都加到结果集里

                /*foreach (var item in videodict)
                 * {
                 *  pr.Items.Add(new ParseResultItem(new Uri(item.Key)));
                 * }*/
            }
            else             //如果只有一个清晰度,不进行选择
            {
                urladdress = defaultUrl;

                //DEBUG
                //pr.Items.Add(new ParseResultItem(new Uri(urladdress)));
            }

            pr.Items.Add(new ParseResultItem(new Uri(urladdress)));
            return(pr);
        }
示例#21
0
        //下载视频
        public bool Download()
        {
            //开始下载
            delegates.TipText(new ParaTipText(this.Info, "正在分析视频地址"));

            //修正井号
            Info.Url = Info.Url.TrimEnd('#');
            //修正旧版URL
            Info.Url = Info.Url.Replace("bilibili.us", "bilibili.tv");
            //修正简写URL
            if (Regex.Match(Info.Url, @"^av\d{2,6}$").Success)
            {
                Info.Url = "http://www.bilibili.tv/video/" + Info.Url + "/";
            }
            //修正index_1.html
            if (!Info.Url.EndsWith(".html"))
            {
                if (Info.Url.EndsWith("/"))
                {
                    Info.Url += "index_1.html";
                }
                else
                {
                    Info.Url += "/index_1.html";
                }
            }

            string url = Info.Url;
            //取得子页面文件名(例如"/video/av12345/index_123.html")
            string suburl = Regex.Match(Info.Url, @"bilibili\.tv(?<part>/video/av\d+/index_\d+\.html)").Groups["part"].Value;

            //是否通过【自动应答】禁用对话框
            bool disableDialog = false;

            if (Info.AutoAnswer != null)
            {
                foreach (var item in Info.AutoAnswer)
                {
                    if (item.Prefix == "bilibili")
                    {
                        if (item.Identify == "auto")
                        {
                            disableDialog = true;
                        }
                        break;
                    }
                }
            }

            //视频地址数组
            string[] videos = null;

            try
            {
                //取得网页源文件
                string src = Network.GetHtmlSource(url, Encoding.UTF8, Info.Proxy);
                //type值
                string type = "";
                #region 登录并重新获取网页源文件

                //检查是否需要登录
                if (src.Contains("您无权访问本页面"))                 //需要登录
                {
                    CookieContainer cookies = new CookieContainer();
                    //登录Bilibili
                    UserLoginInfo user;
                    //检查插件配置
                    try
                    {
                        user          = new UserLoginInfo();
                        user.Username = Encoding.UTF8.GetString(Convert.FromBase64String(Info.Settings["user"]));
                        user.Password = Encoding.UTF8.GetString(Convert.FromBase64String(Info.Settings["password"]));
                        if (string.IsNullOrEmpty(user.Username) || string.IsNullOrEmpty(user.Password))
                        {
                            throw new Exception();
                        }
                    }
                    catch
                    {
                        user = ToolForm.CreateLoginForm("https://secure.bilibili.tv/member/index_do.php?fmdo=user&dopost=regnew");
                        Info.Settings["user"]     = Convert.ToBase64String(Encoding.UTF8.GetBytes(user.Username));
                        Info.Settings["password"] = Convert.ToBase64String(Encoding.UTF8.GetBytes(user.Password));
                    }
                    //Post的数据
                    string postdata = "fmdo=login&dopost=login&refurl=http%%3A%%2F%%2Fbilibili.tv%%2F&keeptime=604800&userid=" + user.Username + "&pwd=" + user.Password + "&keeptime=604800";
                    byte[] data     = Encoding.UTF8.GetBytes(postdata);
                    //生成请求
                    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://secure.bilibili.tv/member/index_do.php");
                    req.Method          = "POST";
                    req.Referer         = "https://secure.bilibili.tv/login.php";
                    req.ContentType     = "application/x-www-form-urlencoded";
                    req.ContentLength   = data.Length;
                    req.UserAgent       = "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0";
                    req.CookieContainer = new CookieContainer();
                    //发送POST数据
                    using (var outstream = req.GetRequestStream())
                    {
                        outstream.Write(data, 0, data.Length);
                        outstream.Flush();
                    }
                    //关闭请求
                    req.GetResponse().Close();
                    cookies = req.CookieContainer;                                           //保存cookies
                    string cookiesstr = req.CookieContainer.GetCookieHeader(req.RequestUri); //字符串形式的cookies

                    //重新请求网页
                    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
                    if (Info.Proxy != null)
                    {
                        request.Proxy = Info.Proxy;
                    }
                    //设置cookies
                    request.CookieContainer = cookies;
                    //获取网页源代码
                    src = Network.GetHtmlSource(request, Encoding.UTF8);
                }

                #endregion

                //取得视频标题
                Regex rTitle = new Regex(@"<title>(?<title>.*)</title>");
                Match mTitle = rTitle.Match(src);
                //文件名称
                string title = mTitle.Groups["title"].Value.Replace("- 嗶哩嗶哩", "").Replace("- ( ゜- ゜)つロ", "").Replace("乾杯~", "").Replace("- bilibili.tv", "").Trim();

                //取得子标题
                Regex           rSubTitle  = new Regex(@"<option value='(?<part>.+?\.html)'(| selected)>(?<content>.+?)</option>");
                MatchCollection mSubTitles = rSubTitle.Matches(src);

                //如果存在下拉列表框
                if (mSubTitles.Count > 0)
                {
                    //确定当前视频的子标题
                    foreach (Match item in mSubTitles)
                    {
                        if (suburl == item.Groups["part"].Value)
                        {
                            title = title + " - " + item.Groups["content"].Value;
                            break;
                        }
                    }

                    //如果需要解析关联下载项
                    //解析关联项需要同时满足的条件:
                    //1.这个任务不是被其他任务所添加的
                    //2.用户设置了“解析关联项”
                    if (!Info.IsBeAdded)
                    {
                        if (Info.ParseRelated)
                        {
                            //准备(地址-标题)字典
                            var dict = new Dictionary <string, string>();
                            foreach (Match item in mSubTitles)
                            {
                                if (suburl != item.Groups["part"].Value)
                                {
                                    dict.Add(url.Replace(suburl, item.Groups["part"].Value),
                                             item.Groups["content"].Value);
                                }
                            }
                            //用户选择任务
                            var ba = new Collection <string>();
                            if (!disableDialog)
                            {
                                ba = ToolForm.CreateMultiSelectForm(dict, Info.AutoAnswer, "bilibili");
                            }
                            //根据用户选择新建任务
                            foreach (string u in ba)
                            {
                                //新建任务
                                delegates.NewTask(new ParaNewTask(Info.BasePlugin, u, this.Info));
                            }
                        }
                    }
                }


                Info.Title = title;
                //过滤非法字符
                title = Tools.InvalidCharacterFilter(title, "");
                //重新设置保存目录(生成子文件夹)
                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.SubFilePath.Clear();

                //视频id
                string id = "";

                //分析id和视频存放站点(type)
                //取得"bofqi块的源代码
                Regex  rEmbed   = new Regex("<div class=\"scontent\" id=\"bofqi\">(?<content>.*?)</div>", RegexOptions.Singleline);
                Match  mEmbed   = rEmbed.Match(src);
                string embedSrc = mEmbed.Groups["content"].Value.Replace("type=\"application/x-shockwave-flash\"", "");

                //检查"file"参数
                Regex rFile = new Regex("file=(\"|)(?<file>.+?)(\"|&)");
                Match mFile = rFile.Match(embedSrc);
                //取得Flash地址
                Regex rFlash = new Regex("src=\"(?<flash>.*?\\.swf)\"");
                Match mFlash = rFlash.Match(embedSrc);
                //取得id值
                Regex rId = new Regex(@"(?<idname>(\w{0,2}id|data))=(?<id>([\w\-]+|$http://.+?$))".Replace("$", "\""));
                Match mId = rId.Match(embedSrc);
                //取得ID
                id = mId.Groups["id"].Value;
                //取得type值
                type = mId.Groups["idname"].Value;

                //解析器的解析结果
                ParseResult pr = null;

                //如果不是“仅下载字幕”
                if (Info.DownSub != DownloadSubtitleType.DownloadSubtitleOnly)
                {
                    if (mFile.Success)                     //如果有file参数
                    {
                        string fileurl = mFile.Groups["file"].Value;
                        videos = new string[] { fileurl };
                    }
                    else if (mId.Success)                    //如果是普通的外链
                    {
                        //检查外链
                        switch (type)
                        {
                        case "qid":                                 //QQ视频
                            //解析视频
                            QQVideoParser parserQQ = new QQVideoParser();
                            pr = parserQQ.Parse(new ParseRequest()
                            {
                                Id = id, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer
                            });
                            videos = pr.ToArray();
                            break;

                        case "ykid":                                 //优酷视频
                            //解析视频
                            YoukuParser parserYouKu = new YoukuParser();
                            pr = parserYouKu.Parse(new ParseRequest()
                            {
                                Id = id, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer
                            });
                            videos = pr.ToArray();
                            break;

                        case "uid":                                 //土豆视频
                            //解析视频
                            TudouParser parserTudou = new TudouParser();
                            pr = parserTudou.Parse(new ParseRequest()
                            {
                                Id = id, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer
                            });
                            videos = pr.ToArray();
                            break;

                        case "data":                                 //Flash游戏
                            id     = id.Replace("\"", "");
                            videos = new string[] { id };
                            break;

                        default:                                 //新浪视频
                            SinaVideoParser parserSina = new SinaVideoParser();
                            pr = parserSina.Parse(new ParseRequest()
                            {
                                Id = id, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer
                            });
                            videos = pr.ToArray();
                            break;
                        }
                    }
                    else                     //如果是游戏
                    {
                        string flashurl = mFlash.Groups["flash"].Value;
                        videos = new string[] { flashurl };
                    }

                    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 (string.IsNullOrEmpty(ext))
                        {
                            if (string.IsNullOrEmpty(Path.GetExtension(videos[i])))
                            {
                                ext = ".flv";
                            }
                            else
                            {
                                ext = Path.GetExtension(videos[i]);
                            }
                        }
                        if (ext == ".hlv")
                        {
                            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,
                                //提取缓存
                                ExtractCache        = Info.ExtractCache,
                                ExtractCachePattern = "fla*.tmp"
                            };
                        }
                        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,
                                //提取缓存
                                ExtractCache        = Info.ExtractCache,
                                ExtractCachePattern = "fla*.tmp"
                            };
                        }
                        //添加文件路径到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 + " 下载失败";
                            }
                        }
                    }            //end for
                }                //end 判断是否下载视频

                //下载弹幕
                bool comment = DownloadComment(title, id);
                //生成AcPlay文件
                string acplay = GenerateAcplayConfig(pr, title);

                if (!comment)
                {
                    Info.PartialFinished        = true;
                    Info.PartialFinishedDetail += "\r\n弹幕文件文件下载失败";
                }

                //支持导出列表
                StringBuilder sb = new StringBuilder(videos.Length * 2);
                foreach (string item in videos)
                {
                    sb.Append(item);
                    sb.Append("|");
                }
                if (Info.Settings.ContainsKey("ExportUrl"))
                {
                    Info.Settings["ExportUrl"] = sb.ToString();
                }
                else
                {
                    Info.Settings.Add("ExportUrl", sb.ToString());
                }
                //支持AcPlay
                if (Info.Settings.ContainsKey("AcPlay"))
                {
                    Info.Settings["AcPlay"] = acplay;
                }
                else
                {
                    Info.Settings.Add("AcPlay", acplay);
                }
            }
            catch (Exception ex)
            {
                Info.Settings["user"]     = "";
                Info.Settings["password"] = "";
                throw ex;
            }

            return(true);
        }
示例#22
0
        /// <summary>
        /// 解析优酷视频源文件地址
        /// </summary>
        ///<remarks>自动应答会检查前缀为<i>youku</i>的所有设置</remarks>
        public ParseResult Parse(ParseRequest request)
        {
            ParseResult pr     = new ParseResult();
            string      urlpre = @"http://v.youku.com/player/getPlayList/VideoIDS/%ID%/timezone/+08/version/5/source/video?n=3&ran=4656&password=%PW%";
            string      url    = urlpre.Replace(@"%ID%", request.Id).Replace(@"%PW%", request.Password);
            string      xmldoc = Network.GetHtmlSource(url, Encoding.UTF8, request.Proxy);
            //选择语言
            Regex rLang = new Regex(@"(?<=""audiolang"":\[).+?(?=\])");
            Match mLang = rLang.Match(xmldoc);

            if (mLang.Success)             //如果存在多种语言
            {
                string                      langs       = mLang.Value;
                Regex                       rLanguage   = new Regex(@"""lang"":""(?<lang>.+?)"",""vid"":""(?<vid>.+?)""");
                MatchCollection             mcLanguages = rLanguage.Matches(langs);
                Dictionary <string, string> langDict    = new Dictionary <string, string>();
                foreach (Match mLanguage in mcLanguages)
                {
                    langDict.Add(mLanguage.Groups["vid"].Value, Tools.ReplaceUnicode2Str(mLanguage.Groups["lang"].Value));
                }
                string chosenId = ToolForm.CreateSingleSelectForm("您正在下载的视频有多种语言版本,请选择语言:", langDict, "", request.AutoAnswers, "youku");
                request.Id = chosenId;
                url        = urlpre.Replace(@"%ID%", request.Id).Replace(@"%PW%", request.Password);
                xmldoc     = Network.GetHtmlSource(url, Encoding.UTF8, request.Proxy);
            }

            //正则表达式提取各个参数
            string regexstring = "\"seed\":(?<seed>\\w+),.+\"key1\":\"(?<key1>\\w+)\",\"key2\":\"(?<key2>\\w+)\".+\"streamfileids\":{\"(?<fileposfix>\\w+)\":\"(?<fileID>[0-9\\*]+)";
            Regex  r           = new Regex(regexstring);
            Match  m           = r.Match(xmldoc);
            //提取参数
            double seed = Double.Parse(m.Groups["seed"].Value);
            string key1 = m.Groups["key1"].Value;
            string key2 = m.Groups["key2"].Value;


            //提取各视频参数
            Regex  rStreamFileIds = new Regex(@"""streamfileids"":{(?<fileids>.+?)}");
            Match  mStreamFileIds = rStreamFileIds.Match(xmldoc);
            string fileIds        = mStreamFileIds.Groups["fileids"].Value;

            var    dict       = new Dictionary <string, string>();
            string defaultres = "";

            //是否有超清模式
            if (fileIds.Contains("hd2"))
            {
                dict.Add("hd2", "超清(hd2)");
                defaultres = "hd2";
            }
            //是否有高清模式
            if (fileIds.Contains("mp4"))
            {
                dict.Add("mp4", "高清(mp4)");
                defaultres = "mp4";
            }
            //是否有普通清晰度
            if (fileIds.Contains("flv"))
            {
                dict.Add("flv", "标清(flv)");
                defaultres = "flv";
            }


            string fileposfix = null;
            string strSelect  = null;

            //自动应答
            if (request.AutoAnswers != null && request.AutoAnswers.Count > 0)
            {
                foreach (var item in request.AutoAnswers)
                {
                    if (item.Prefix == "youku")
                    {
                        if (fileIds.Contains(item.Identify))
                        {
                            strSelect  = item.Identify;
                            fileposfix = item.Identify;
                            break;
                        }
                    }
                }
            }

            if (string.IsNullOrEmpty(fileposfix))
            {
                //如果多余一种清晰度
                if (dict.Count > 1)
                {
                    fileposfix = ToolForm.CreateSingleSelectForm("您正在下载优酷视频,请选择视频清晰度:", dict, defaultres, request.AutoAnswers, "youku");
                }
                else
                {
                    fileposfix = defaultres;
                }
                strSelect = fileposfix;
            }

            //修正高清
            if (fileposfix == "hd2")
            {
                fileposfix = "flv";
            }


            //取得FileID
            Regex  rFileID = new Regex(@"""" + strSelect + @""":""(?<fileid>.+?)""");
            Match  mFileID = rFileID.Match(fileIds);
            string fileID  = mFileID.Groups["fileid"].Value;

            //提取视频个数
            int    flv_no     = 0;
            string regexFlvNo = @"""segs"":{""\w+"":\[(?<content>.+?)\]";
            Regex  rn         = new Regex(regexFlvNo);
            Match  mn         = rn.Match(xmldoc);

            char[] tmp_content = mn.Groups["content"].Value.ToCharArray();
            foreach (char item in tmp_content)
            {
                if (item == '{')
                {
                    flv_no++;
                }
            }

            //提取key
            Regex  rSegs    = new Regex(@"segs"":{(?<segs>.+?)},""streamsizes");
            Match  mSegs    = rSegs.Match(xmldoc);
            string segs     = mSegs.Groups["segs"].Value;
            Regex  rSegsSub = new Regex(@"""" + strSelect + @""":\[(?<segssub>.+?)\]");
            Match  mSegsSub = rSegsSub.Match(segs);
            string segssub  = mSegsSub.Groups["segssub"].Value;


            string          regexKey = @"""k"":""(?<k>\w+)"",""k2"":""(?<k2>\w+)""";
            MatchCollection mcKey    = Regex.Matches(segssub, regexKey);
            List <string>   keys     = new List <string>();

            foreach (Match mKey in mcKey)
            {
                keys.Add("?K=" + mKey.Groups["k"].Value + ",k2:" + mKey.Groups["k2"].Value);
            }

            //生成sid
            string sid = genSid();
            //生成fileid
            string fileid = getFileID(fileID, seed);
            //生成key
            //string key = genKey(key1, key2);
            //添加各个地址
            List <string> lst = new List <string>();

            for (int i = 0; i < keys.Count; i++)
            {
                //得到地址
                string u = "http://f.youku.com/player/getFlvPath/sid/" + sid + "_" + string.Format("{0:D2}", i) +
                           //"/st/" + fileposfix + "/fileid/" + fileid.Substring(0, 8) + string.Format("{0:D2}", i)
                           "/st/" + fileposfix + "/fileid/" + fileid.Substring(0, 8) + string.Format("{0:X2}", i)
                           + fileid.Substring(10) + keys[i];
                //添加地址
                pr.Items.Add(new ParseResultItem(u));
            }

            //提取各项详细信息
            MatchCollection mcSegs = Regex.Matches(segssub, @"{.+?}");

            for (int i = 0; i < mcSegs.Count; i++)
            {
                MatchCollection mcKeys = Regex.Matches(mcSegs[i].Value, @"""(?<key>\w+)"":""(?<value>\w+)""");
                foreach (Match mkey in mcKeys)
                {
                    string k = mkey.Groups["key"].Value;
                    string v = mkey.Groups["value"].Value;
                    //修正length和order
                    if (k.Equals("seconds"))
                    {
                        k = "length";
                        v = (Int32.Parse(v) * 1000).ToString();
                    }
                    if (k.Equals("no"))
                    {
                        k = "order";
                    }
                    pr.Items[i].Information.Add(k, v);
                }
            }

            return(pr);
        }
示例#23
0
        /// <summary>
        /// 下载视频
        /// </summary>
        /// <returns></returns>
        public override bool Download()
        {
            //开始下载
            delegates.TipText(new ParaTipText(this.Info, "正在分析视频地址"));

            //修正井号
            Info.Url = Info.Url.TrimEnd('#');
            //修正简写URL
            if (Regex.Match(Info.Url, @"^ac\d+$").Success)
            {
                Info.Url = "http://www.acfun.tv/v/" + Info.Url;
            }

            //修正index.html
            if (!Info.Url.EndsWith(".html"))
            {
                if (Info.Url.EndsWith("/"))
                {
                    Info.Url += "index.html";
                }
                else
                {
                    Info.Url += "/index.html";
                }
            }

            string url = Info.Url;
            //取得子页面文件名(例如"index_123.html")
            string suburl = Regex.Match(Info.Url, @"ac\d+/(?<part>index\.html|index_\d+\.html)").Groups["part"].Value;

            //取得AC号和子编号
            Match mACNumber = Regex.Match(Info.Url, @"(?<ac>ac\d+)/index(_(?<sub>\d+)|)\.html");

            Settings["ACNumber"]    = mACNumber.Groups["ac"].Value;
            Settings["ACSubNumber"] = mACNumber.Groups["sub"].Success ? mACNumber.Groups["sub"].Value : "1";
            //设置自定义文件名
            Settings["CustomFileName"] = AcFunPlugin.DefaultFileNameFormat;
            if (Info.BasePlugin.Configuration.ContainsKey("CustomFileName"))
            {
                Settings["CustomFileName"] = Info.BasePlugin.Configuration["CustomFileName"];
            }

            //是否通过【自动应答】禁用对话框
            bool disableDialog = false;

            if (Info.AutoAnswer != null)
            {
                foreach (var item in Info.AutoAnswer)
                {
                    if (item.Prefix == "acfun")
                    {
                        if (item.Identify == "auto")
                        {
                            disableDialog = true;
                        }
                        break;
                    }
                }
            }

            try
            {
                //取得网页源文件
                string src = Network.GetHtmlSource(url, Encoding.UTF8, Info.Proxy);

                //分析id和视频存放站点(type)
                string type;
                string id = "";                 //视频id
                //string ot = ""; //视频子id

                //取得embed块的源代码
                Regex  rEmbed   = new Regex(@"\<div id=""area-player""\>.+?\</div\>", RegexOptions.Singleline);
                Match  mEmbed   = rEmbed.Match(src);
                string embedSrc = mEmbed.ToString().Replace("type=\"application/x-shockwave-flash\"", "");

                //检查是否为Flash游戏
                Regex rFlash = new Regex(@"src=""(?<player>.+?)\.swf""");
                Match mFlash = rFlash.Match(embedSrc);

                #region 取得当前Flash播放器地址
                //脚本地址
                string playerScriptUrl = "http:" + Regex.Match(src, @"(?<=<script src="")//static\.acfun\.tv/dotnet/\d+/script/article\.js(?="">)").Value + @"?_version=12289360";
                //脚本源代码
                string playerScriptSrc = Network.GetHtmlSource(playerScriptUrl, Encoding.UTF8, Info.Proxy);
                //swf文件地址
                string playerUrl = Regex.Match(playerScriptSrc, @"http://.+?swf").Value;
                //添加到插件设置中
                if (Info.Settings.ContainsKey("PlayerUrl"))
                {
                    Info.Settings["PlayerUrl"] = playerUrl;
                }
                else
                {
                    Info.Settings.Add("PlayerUrl", playerUrl);
                }

                #endregion


                //如果是Flash游戏
                if (mFlash.Success && !mFlash.Value.Contains("newflvplayer"))
                {
                    type = "game";
                }
                else
                {
                    if (!embedSrc.Contains(@"text/javascript"))                     //旧版本
                    {
                        //获取ID
                        Regex rId = new Regex(@"(\?|amp;|"")id=(?<id>\w+)(?<ot>(-\w*|))");
                        Match mId = rId.Match(embedSrc);
                        id = mId.Groups["id"].Value;
                        if (Info.Settings.ContainsKey("cid"))
                        {
                            Info.Settings["cid"] = id;
                        }
                        else
                        {
                            Info.Settings.Add("cid", id);
                        }


                        //取得type值
                        Regex rType = new Regex(@"type(|\w)=(?<type>\w*)");
                        Match mType = rType.Match(embedSrc);
                        type = mType.Groups["type"].Value;
                        if (type.Equals("video", StringComparison.CurrentCultureIgnoreCase))
                        {
                            type = "sina";
                        }
                    }
                    else
                    {
                        //取得acfun id值
                        Regex  rAcfunId = new Regex(@"'id':'(?<id>\d+)");
                        Match  mAcfunId = rAcfunId.Match(embedSrc);
                        string acfunid  = mAcfunId.Groups["id"].Value;

                        //获取跳转
                        string getvideobyid = Network.GetHtmlSource("http://www.acfun.tv/api/getVideoByID.aspx?vid=" + acfunid, Encoding.UTF8);

                        //将信息添加到Setting中
                        Regex           rVideoInfo  = new Regex(@"""(?<key>.+?)"":(""|)(?<value>.+?)(""|)[,|}]");
                        MatchCollection mcVideoInfo = rVideoInfo.Matches(getvideobyid);
                        foreach (Match mVideoInfo in mcVideoInfo)
                        {
                            string key   = mVideoInfo.Groups["key"].Value;
                            string value = mVideoInfo.Groups["value"].Value;
                            if (Info.Settings.ContainsKey(key))
                            {
                                Info.Settings[key] = value;
                            }
                            else
                            {
                                Info.Settings.Add(key, value);
                            }
                        }

                        id   = Info.Settings["vid"];
                        type = Info.Settings["vtype"];
                    }
                }

                //取得视频标题
                Regex  rTitle = new Regex(@"<title>(?<title>.*)</title>");
                Match  mTitle = rTitle.Match(src);
                string title  = mTitle.Groups["title"].Value.Replace(" - Acfun", "").Replace(" - 天下漫友是一家", "");

                //取得所有子标题
                Regex           rSubTitle  = new Regex(@"<a class=""pager pager-article"" href=""(?<part>.+?)"">(?<content>.+?)</a>");
                MatchCollection mSubTitles = rSubTitle.Matches(src);


                //如果存在下拉列表框
                if (mSubTitles.Count > 0)
                {
                    //解析关联项需要同时满足的条件:
                    //1.这个任务不是被其他任务所添加的
                    //2.用户设置了“解析关联项”
                    if (!Info.IsBeAdded)
                    {
                        if (Info.ParseRelated)
                        {
                            //准备(地址-标题)字典
                            var dict = new Dictionary <string, string>();
                            foreach (Match item in mSubTitles)
                            {
                                dict.Add(url.Replace(suburl, item.Groups["part"].Value),
                                         item.Groups["content"].Value);
                            }
                            //用户选择任务
                            var ba = new Collection <string>();
                            if (!disableDialog)
                            {
                                ba = ToolForm.CreateMultiSelectForm(dict, Info.AutoAnswer, "acfun");
                            }
                            //根据用户选择新建任务
                            foreach (string u in ba)
                            {
                                //新建任务
                                delegates.NewTask(new ParaNewTask(Info.BasePlugin, u, this.Info));
                            }
                        }
                    }
                }


                Info.Title = title;
                //过滤非法字符
                title = Tools.InvalidCharacterFilter(title, "");

                //视频地址数组
                string[] videos = null;
                //清空地址
                Info.FilePath.Clear();
                Info.SubFilePath.Clear();


                //下载弹幕
                bool comment = DownloadSubtitle(title);
                if (!comment)
                {
                    Info.PartialFinished        = true;
                    Info.PartialFinishedDetail += "\r\n弹幕文件文件下载失败";
                }

                //解析器的解析结果
                ParseResult pr = null;

                //如果允许下载视频
                if ((Info.DownloadTypes & DownloadType.Video) != 0)
                {
                    //检查type值
                    switch (type)
                    {
                    case "sina":                             //新浪视频
                        //解析视频
                        SinaVideoParser parserSina = new SinaVideoParser();
                        pr = parserSina.Parse(new ParseRequest()
                        {
                            Id = id, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer
                        });
                        videos = pr.ToArray();
                        break;

                    case "qq":                             //QQ视频
                        //解析视频
                        QQVideoParser parserQQ = new QQVideoParser();
                        pr = parserQQ.Parse(new ParseRequest()
                        {
                            Id = id, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer
                        });
                        videos = pr.ToArray();
                        break;

                    case "youku":                             //优酷视频
                        //解析视频
                        YoukuParser parserYouKu = new YoukuParser();
                        pr = parserYouKu.Parse(new ParseRequest()
                        {
                            Id = id, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer
                        });
                        videos = pr.ToArray();
                        break;

                    case "tudou":                             //土豆视频
                        TudouParser parserTudou = new TudouParser();
                        pr = parserTudou.Parse(new ParseRequest()
                        {
                            Id = id, Proxy = Info.Proxy, AutoAnswers = Info.AutoAnswer
                        });
                        videos = pr.ToArray();
                        break;

                    case "game":                             //flash游戏
                        videos = new string[] { mFlash.Groups["player"].Value };
                        break;
                    }

                    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 (string.IsNullOrEmpty(ext))
                        {
                            if (string.IsNullOrEmpty(Path.GetExtension(videos[i])))
                            {
                                ext = ".flv";
                            }
                            else
                            {
                                ext = Path.GetExtension(videos[i]);
                            }
                        }
                        if (ext == ".hlv")
                        {
                            ext = ".flv";
                        }

                        //设置文件名
                        var    renamehelper = new CustomFileNameHelper();
                        string filename     = renamehelper.CombineFileName(Settings["CustomFileName"],
                                                                           title, "", Info.PartCount == 1 ? "" : Info.CurrentPart.ToString(),
                                                                           ext.Replace(".", ""), Info.Settings["ACNumber"], Info.Settings["ACSubNumber"]);
                        filename = Path.Combine(Info.SaveDirectory.ToString(), filename);

                        //生成父文件夹
                        if (!Directory.Exists(Path.GetDirectoryName(filename)))
                        {
                            Directory.CreateDirectory(Path.GetDirectoryName(filename));
                        }

                        //设置当前DownloadParameter
                        currentParameter = new DownloadParameter()
                        {
                            //文件名
                            FilePath = filename,
                            //文件URL
                            Url = videos[i],
                            //代理服务器
                            Proxy = Info.Proxy,
                            //提取缓存
                            ExtractCache        = Info.ExtractCache,
                            ExtractCachePattern = "fla*.tmp"
                        };


                        //设置代理服务器
                        currentParameter.Proxy = Info.Proxy;
                        //添加文件路径到List<>中
                        Info.FilePath.Add(currentParameter.FilePath);
                        //下载文件
                        bool success = false;

                        //提示更换新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
                }                //end 判断是否下载视频


                //如果插件设置中没有GenerateAcPlay项,或此项设置为true则生成.acplay快捷方式
                if (!Info.BasePlugin.Configuration.ContainsKey("GenerateAcPlay") ||
                    Info.BasePlugin.Configuration["GenerateAcPlay"] == "true")
                {
                    //生成AcPlay文件
                    string acplay = GenerateAcplayConfig(pr, title);
                    //支持AcPlay直接播放
                    Info.Settings["AcPlay"] = acplay;
                }

                //支持导出列表
                if (videos != null)
                {
                    StringBuilder sb = new StringBuilder(videos.Length * 2);
                    foreach (string item in videos)
                    {
                        sb.Append(item);
                        sb.Append("|");
                    }
                    if (Info.Settings.ContainsKey("ExportUrl"))
                    {
                        Info.Settings["ExportUrl"] = sb.ToString();
                    }
                    else
                    {
                        Info.Settings.Add("ExportUrl", sb.ToString());
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            //下载成功完成
            return(true);
        }
示例#24
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);
        }
示例#25
0
        //下载漫画
        public bool Download()
        {
            //开始下载
            delegates.TipText(new ParaTipText(this.Info, "正在分析漫画地址"));

            try
            {
                //取得Url源文件
                string src = Network.GetHtmlSource(Info.Url, Encoding.UTF8, Info.Proxy);

                //要下载的Url列表(页面)
                List <string> subUrls = new List <string>();

                //漫画id
                int comicId;

                //是否为漫画的介绍页面
                bool isIntroPage = !Regex.IsMatch(Info.Url, @"/HTML/\w+/\w+", RegexOptions.IgnoreCase);

                #region 确定是整部漫画还是单独一话

                //如果为整部漫画
                if (isIntroPage)
                {
                    //取得所有漫画的列表
                    Regex           rAllComics  = new Regex(@"<li><a href=""(?<page>(http://\w+\.sfacg\.com/AllComic/)?.+?)"" target=""_blank"">(?<title>.+?)</a>");
                    MatchCollection mcAllComics = rAllComics.Matches(src);

                    //新建(url-标题)字典
                    var dict = new Dictionary <string, string>();

                    foreach (Match item in mcAllComics)
                    {
                        string comicPage = item.Groups["page"].Value;
                        if (comicPage.StartsWith("/"))
                        {
                            comicPage = "http://comic.sfacg.com" + comicPage;
                        }
                        string comicTitle = item.Groups["title"].Value;
                        if (Regex.IsMatch(comicTitle, @"(?<=<(\w+) .*?>).+?(?=</\1>)"))
                        {
                            comicTitle = Regex.Match(comicTitle, @"(?<=<(\w+) .*?>).+?(?=</\1>)").Value;
                        }
                        dict.Add(comicPage, comicTitle);
                    }

                    //选择下载哪部漫画
                    var selected = ToolForm.CreateMultiSelectForm(dict, Info.AutoAnswer, "sfacgcomic");

                    //将地址填充到下载列表中
                    subUrls.AddRange(selected);

                    //如果用户没有选择任何章节
                    if (subUrls.Count == 0)
                    {
                        return(false);
                    }

                    //取得漫画标题
                    string title = Regex.Match(src, @"(?<=<title>).+?(?=,)").Value;
                    //过滤标题中的非法字符
                    title      = Tools.InvalidCharacterFilter(title, "");
                    Info.Title = title;
                    //获取漫画ID
                    comicId = int.Parse(Regex.Match(src, @"(?<=var comicCounterID = )\d+", RegexOptions.IgnoreCase).Value);
                }
                else                 //如果不是整部漫画则添加此单话url
                {
                    subUrls.Add(Info.Url);
                    //取得漫画标题
                    //取得源代码并分析
                    string pSrc = Network.GetHtmlSource(Info.Url, Encoding.UTF8, Info.Proxy);
                    //取得漫画标题
                    Regex  rTitle = new Regex(@"> > <a href=""http://comic.sfacg.com/HTML/.+>(?<title>.+?)</a>");
                    Match  mTitle = rTitle.Match(pSrc);
                    string title  = mTitle.Groups["title"].Value;
                    //过滤标题中的非法字符
                    title      = Tools.InvalidCharacterFilter(title, "");
                    Info.Title = title;
                    //获取漫画ID
                    comicId = int.Parse(Regex.Match(pSrc, @"(?<=var c = )\d+", RegexOptions.IgnoreCase).Value);
                }                 //end if

                #endregion

                #region  载漫画

                //建立文件夹
                string mainDir = Info.SaveDirectory + (Info.SaveDirectory.ToString().EndsWith(@"\") ? "" : @"\") + Info.Title;
                //确定漫画共有几个段落
                Info.PartCount = subUrls.Count;

                //分段落下载
                for (int i = 0; i < Info.PartCount; i++)
                {
                    Info.CurrentPart = i + 1;
                    //提示更换新Part
                    delegates.NewPart(new ParaNewPart(this.Info, i + 1));

                    //地址数组
                    Dictionary <string, string> files = new Dictionary <string, string>();

                    //分析源代码,取得下载地址
                    WebClient wc = new WebClient();
                    if (Info.Proxy != null)
                    {
                        wc.Proxy = Info.Proxy;
                    }

                    //取得源代码
                    byte[] buff   = wc.DownloadData(subUrls[i]);
                    string cookie = wc.ResponseHeaders.Get("Set-Cookie");
                    string source = Encoding.UTF8.GetString(buff);
                    //取得标题
                    Regex  rTitle   = new Regex(@"> > (?<title>\S+?)</div>");
                    Match  mTitle   = rTitle.Match(source);
                    string subTitle = mTitle.Groups["title"].Value;
                    //过滤子标题中的非法字符
                    subTitle = Tools.InvalidCharacterFilter(subTitle, "");
                    //合并本地路径(文件夹)
                    string subDir = mainDir + @"\" + subTitle;
                    //创建文件夹
                    Directory.CreateDirectory(subDir);


                    #region 取得js文件


                    //取得js文件路径
                    string urljs = subUrls[i];
                    //分析漫画id
                    Regex  rjs      = new Regex(@"(?<server>http://\w+\.sfacg\.com/)HTML/\w+/(?<id>.+)");
                    Match  mjs      = rjs.Match(urljs);
                    string jsserver = mjs.Groups["server"].Value;
                    string jsid     = mjs.Groups["id"].Value.TrimEnd('/');
                    urljs = jsserver + "Utility/" + comicId + "/" + jsid + ".js";

                    #endregion


                    //取得JS文件内容
                    string jscontent = Network.GetHtmlSource(urljs, Encoding.UTF8);

                    //添加到url数组
                    Regex           rFiles = new Regex(@"picAy\[(?<no>\d+)\] = ""(?<file>.+?(?<ext>\w{3}))""");
                    MatchCollection mFiles = rFiles.Matches(jscontent);
                    //添加url到数组
                    foreach (Match item in mFiles)
                    {
                        //将 url - 本地文件 添加到字典中
                        files.Add("http://comic.sfacg.com/" + item.Groups["file"].Value,
                                  Path.Combine(subDir, item.Groups["no"].Value + "." + item.Groups["ext"].Value));
                    }

                    //设置下载长度
                    currentParameter.TotalLength = files.Count;
                    currentParameter.DoneBytes   = 0;

                    //下载文件
                    foreach (string key in files.Keys)
                    {
                        if (currentParameter.IsStop)
                        {
                            return(false);
                        }
                        try
                        {
                            wc.Headers.Add("Referer", subUrls[i]);
                            wc.Headers.Add("Cookie", cookie);
                            byte[] content = wc.DownloadData(key);
                            File.WriteAllBytes(files[key], content);
                        }
                        catch { } //end try
                        currentParameter.DoneBytes += 1;
                    }             // end foreach
                }                 //end for
                #endregion
            }                     //end try
            catch (Exception ex)  //出现错误即下载失败
            {
                throw ex;
            }            //end try


            //下载成功完成
            currentParameter.DoneBytes = currentParameter.TotalLength;
            return(true);
        }        //end DownloadVideo
示例#26
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);
        }
示例#27
0
文件: Acfun.cs 项目: wly5556/acdown
        /// <summary>
        /// 下载视频
        /// </summary>
        /// <returns></returns>
        public override bool Download()
        {
            //开始下载
            delegates.TipText(new ParaTipText(this.Info, "正在分析视频地址"));

            //修正井号
            Info.Url = Info.Url.TrimEnd('#');

            //修正简写URL
            if (Regex.Match(Info.Url, @"^ac\d+$").Success)
            {
                Info.Url = "http://www.acfun.tv/v/" + Info.Url;
            }
            else if (!Info.Url.StartsWith("http://", StringComparison.CurrentCultureIgnoreCase))
            {
                Info.Url = "http://" + Info.Url;
            }

            //修正URL为 http://www.acfun.tv/v/ac12345_67 形式
            Info.Url = Info.Url.Replace(".html", "").Replace("/index", "");
            if (!Info.Url.Contains("_"))
            {
                Info.Url += "_1";
            }

            //取得AC号和子编号
            Match mAcNumber = Regex.Match(Info.Url, @"(?<ac>ac\d+)_(?<sub>\d+)");

            m_acNumber    = mAcNumber.Groups["ac"].Value;
            m_acSubNumber = mAcNumber.Groups["sub"].Value;
            //设置自定义文件名
            m_customFileName = AcFunPlugin.DefaultFileNameFormat;
            if (Info.BasePlugin.Configuration.ContainsKey("CustomFileName"))
            {
                m_customFileName = Info.BasePlugin.Configuration["CustomFileName"];
            }

            //是否通过【自动应答】禁用对话框
            bool disableDialog = false;

            disableDialog = AutoAnswer.IsInAutoAnswers(Info.AutoAnswer, "acfun", "auto");

            //当前播放器地址
            Settings["PlayerUrl"] = @"http://static.acfun.tv/player/ssl/ACFlashPlayerN0102.swf";

            //取得网页源文件
            string src = Network.GetHtmlSource(Info.Url, Encoding.UTF8, Info.Proxy);

            var relatedVideoList = new Dictionary <string, string>();


            TipText("正在获取视频详细信息");
            var videoIdCollection = Regex.Matches(src,
                                                  @"<a data-vid=""(?<vid>\d+)"" data-from=""(?<from>\w+)""(?: data-did=""(?<did>\w*?)"")? data-sid=""(?<sid>\w+)"" href=""(?<href>.+?)"" title=""(?<title>.+?)"".+?>(?<content>.+?)</a>",
                                                  RegexOptions.IgnoreCase);

            foreach (Match mVideoId in videoIdCollection)
            {
                //所有子标题
                if (mVideoId.Groups["content"].Value.Contains("<i"))                 //当前标题
                {
                    m_currentPartTitle   = Regex.Replace(mVideoId.Groups["content"].Value, @"<i.+?i>", "", RegexOptions.IgnoreCase);
                    m_currentPartVideoId = mVideoId.Groups["vid"].Value;
                }
                else                 //其他标题
                {
                    relatedVideoList.Add("http://www.acfun.tv" + mVideoId.Groups["href"].Value, mVideoId.Groups["content"].Value);
                }
            }


            //取得视频标题
            var videoTitleMatchResult = Regex.Match(src, @"(?<=system\.title = \$\.parseSafe\(')(.+?)(?='\))", RegexOptions.IgnoreCase);

            if (!videoTitleMatchResult.Success)
            {
                videoTitleMatchResult = Regex.Match(src, @"(?<=<title>).+?(?=</title>)", RegexOptions.IgnoreCase);
            }
            m_videoTitle       = videoTitleMatchResult.Value;
            m_currentPartTitle = string.IsNullOrEmpty(m_currentPartTitle) ? m_videoTitle : m_currentPartTitle;
            m_currentPartTitle = m_currentPartTitle.Replace(" - AcFun弹幕视频网 - 中国宅文化基地", "");

            //取得当前视频完整标题
            Info.Title         = m_videoTitle + " - " + m_currentPartTitle;
            m_videoTitle       = Tools.InvalidCharacterFilter(m_videoTitle, "");
            m_currentPartTitle = Tools.InvalidCharacterFilter(m_currentPartTitle, "");

            //解析关联项需要同时满足的条件:
            //1.这个任务不是被其他任务所添加的
            //2.用户设置了“解析关联项”
            TipText("正在选择关联视频");
            if (!Info.IsBeAdded && Info.ParseRelated && relatedVideoList.Count > 0)
            {
                //用户选择任务
                var ba = new Collection <string>();
                if (!disableDialog)
                {
                    ba = ToolForm.CreateMultiSelectForm(relatedVideoList, Info.AutoAnswer, "acfun");
                }
                //根据用户选择新建任务
                foreach (string u in ba)
                {
                    //新建任务
                    delegates.NewTask(new ParaNewTask(Info.BasePlugin, u, this.Info));
                }
            }


            //视频地址数组
            //清空地址
            Info.FilePath.Clear();
            Info.SubFilePath.Clear();

            //下载弹幕
            DownloadSubtitle(m_currentPartVideoId);

            TipText("正在解析视频源地址");
            //解析器的解析结果
            ParseResult pr = null;

            //如果允许下载视频
            if ((Info.DownloadTypes & DownloadType.Video) != 0)
            {
                var parser = new AcfunInterfaceParser();
                pr = parser.Parse(new ParseRequest
                {
                    Id          = m_currentPartVideoId,
                    Proxy       = Info.Proxy,
                    AutoAnswers = Info.AutoAnswer
                });

                //视频地址列表
                var videos = pr.ToArray();
                //支持导出列表
                if (videos != null)
                {
                    var sb = new StringBuilder();
                    foreach (string item in videos)
                    {
                        sb.Append(item);
                        sb.Append("|");
                    }
                    Settings["ExportUrl"] = sb.ToString();
                }

                //下载视频
                TipText("正在开始下载视频文件");
                //确定视频共有几个段落
                Info.PartCount = videos.Length;

                //------------分段落下载------------
                for (int i = 0; i < Info.PartCount; i++)
                {
                    Info.CurrentPart = i + 1;

                    //取得文件后缀名
                    string ext = Tools.GetExtension(videos[i]);
                    if (string.IsNullOrEmpty(ext))
                    {
                        if (string.IsNullOrEmpty(Path.GetExtension(videos[i])))
                        {
                            ext = ".flv";
                        }
                        else
                        {
                            ext = Path.GetExtension(videos[i]);
                        }
                    }
                    if (ext == ".hlv")
                    {
                        ext = ".flv";
                    }

                    //设置文件名
                    var    renamehelper = new CustomFileNameHelper();
                    string filename     = renamehelper.CombineFileName(m_customFileName,
                                                                       m_videoTitle, m_currentPartTitle, Info.PartCount == 1 ? "" : Info.CurrentPart.ToString(),
                                                                       ext.Replace(".", ""), m_acNumber, m_acSubNumber);
                    filename = Path.Combine(Info.SaveDirectory.ToString(), filename);

                    //添加文件名到文件列表中
                    Info.FilePath.Add(filename);

                    //生成父文件夹
                    if (!Directory.Exists(Path.GetDirectoryName(filename)))
                    {
                        Directory.CreateDirectory(Path.GetDirectoryName(filename));
                    }

                    //设置当前DownloadParameter
                    currentParameter = new DownloadParameter()
                    {
                        //文件名
                        FilePath = filename,
                        //文件URL
                        Url = videos[i],
                        //代理服务器
                        Proxy = Info.Proxy,
                        //提取缓存
                        ExtractCache        = Info.ExtractCache,
                        ExtractCachePattern = "fla*.tmp"
                    };

                    //下载文件
                    bool success = false;

                    //提示更换新Part
                    delegates.NewPart(new ParaNewPart(this.Info, i + 1));

                    //下载视频
                    try
                    {
                        success = Network.DownloadFile(currentParameter, this.Info);
                        if (!success)                         //未出现错误即用户手动停止
                        {
                            return(false);
                        }
                    }
                    catch                     //下载文件时出现错误
                    {
                        //如果此任务由一个视频组成,则报错(下载失败)
                        if (Info.PartCount == 1)
                        {
                            throw;
                        }
                        else                         //否则继续下载,设置“部分失败”状态
                        {
                            Info.PartialFinished        = true;
                            Info.PartialFinishedDetail += "\r\n文件: " + currentParameter.Url + " 下载失败";
                        }
                    }
                }         //end for
            }             //end 判断是否下载视频


            //如果插件设置中没有GenerateAcPlay项,或此项设置为true则生成.acplay快捷方式
            if (!Info.BasePlugin.Configuration.ContainsKey("GenerateAcPlay") ||
                Info.BasePlugin.Configuration["GenerateAcPlay"] == "true")
            {
                //生成AcPlay文件
                string acplay = GenerateAcplayConfig(pr);
                //支持AcPlay直接播放
                Settings["AcPlay"] = acplay;
            }

            //生成视频自动合并参数
            if (Info.FilePath.Count > 1 && !Info.PartialFinished)
            {
                Info.Settings.Remove("VideoCombine");
                var arg = new StringBuilder();
                foreach (var item in Info.FilePath)
                {
                    arg.Append(item);
                    arg.Append("|");
                }

                var    renamehelper = new CustomFileNameHelper();
                string filename     = renamehelper.CombineFileName(m_customFileName,
                                                                   m_videoTitle, m_currentPartTitle, "",
                                                                   "mp4", m_acNumber, m_acSubNumber);
                filename = Path.Combine(Info.SaveDirectory.ToString(), filename);

                arg.Append(filename);
                Info.Settings["VideoCombine"] = arg.ToString();
            }

            //下载成功完成
            return(true);
        }
示例#28
0
        //下载视频
        public override bool Download()
        {
            //开始下载
            TipText("正在解析视频地址");

            //解析专辑
            if (Regex.IsMatch(Info.Url, TudouPlugin.regAlbumcover, RegexOptions.IgnoreCase))
            {
                string          source       = Network.GetHtmlSource(Info.Url, Encoding.GetEncoding("GBK"), Info.Proxy);
                MatchCollection mcAlbumPlays = Regex.Matches(source.Replace(" ", "").Replace("\t", "").Replace("\r\n", ""),
                                                             @"<h6class=""caption.+?(?<url>http://www\.tudou\.com/albumplay/[\w\-]+(/[\w\-]+|)\.html)"">(?<title>.+?)</a></h6>");
                var plays = new Dictionary <string, string>();
                foreach (Match mAlbumPlays in mcAlbumPlays)
                {
                    string aUrl   = mAlbumPlays.Groups["url"].Value;
                    string aTitle = mAlbumPlays.Groups["title"].Value;
                    plays.Add(aUrl, aTitle);
                }
                var chosen = ToolForm.CreateMultiSelectForm(plays, null, "tudou");
                if (chosen.Count == 0)
                {
                    throw new Exception("未从列表中选择任何视频");
                }

                //修正当前url为用户选中的第一个url
                Info.Url = chosen[0];
                //添加其他任务
                for (int i = 1; i < chosen.Count; i++)
                {
                    NewTask(chosen[i]);
                }
            }

            string url = Info.Url;

            //修正豆泡网址
            if (Regex.Match(Info.Url, TudouPlugin.regDpProgramview).Success)
            {
                url = @"http://www.tudou.com/programs/view/" + Regex.Match(Info.Url, TudouPlugin.regDpProgramview).Groups["icode"].Value;
            }
            else if (Regex.IsMatch(Info.Url, TudouPlugin.regDpAlbumList))
            {
                url = Info.Url.Replace("dp.tudou.com", "www.tudou.com");
                url = url.Replace("/l/", "/listplay/");
                url = url.Replace("/a/", "/albumplay/");
            }

            //Settings["icode"] = Regex.Match(Info.Url, TudouPlugin.regProgramView).Groups["icode"].Value;
            string src = Network.GetHtmlSource(url, Encoding.GetEncoding("GBK"), Info.Proxy);

            //取得iid
            Settings["iid"] = Regex.Match(src.Replace(" ", ""), @"(?<=iid:)\d+").Value;
            //取得专辑标题
            Settings["AlbumTitle"] = Regex.Match(src, @"(?<=atitle="").+?(?="")").Value ?? "";
            //视频标题
            Info.Title        = Regex.Match(src, @"(?<=kw:( |)(""|')).+?(?=(""|'))").Value;
            Settings["title"] = Tools.InvalidCharacterFilter(Info.Title, "");
            if (!string.IsNullOrEmpty(Settings["AlbumTitle"]))
            {
                Settings["title"] = Tools.InvalidCharacterFilter(Settings["AlbumTitle"], "")
                                    + Path.DirectorySeparatorChar + Settings["title"];
            }


            //视频地址数组
            string[] videos = null;
            //清空地址
            Info.FilePath.Clear();

            //调用土豆视频解析器
            TudouParser parserTudou = new TudouParser();
            var         pr          = parserTudou.Parse(new ParseRequest()
            {
                Id          = Settings["iid"],
                Proxy       = Info.Proxy,
                AutoAnswers = Info.AutoAnswer
            });

            videos = pr.ToArray();


            //下载弹幕
            if ((Info.DownloadTypes & DownloadType.Subtitle) != 0)
            {
                //如果视频地址属于豆泡
                if (Regex.IsMatch(Info.Url, TudouPlugin.regDpProgramview) ||
                    Regex.IsMatch(Info.Url, TudouPlugin.regDpAlbumList))
                {
                    TipText("正在下载弹幕文件");
                    try
                    {
                        var subfile = Path.Combine(Info.SaveDirectory.ToString(), Settings["title"] + ".json");
                        Info.SubFilePath.Clear();
                        Info.SubFilePath.Add(subfile);
                        Network.DownloadFile(new DownloadParameter()
                        {
                            FilePath = subfile,
                            Url      = "http://comment.dp.tudou.com/comment/get/" + Settings["iid"] + "/vdn12d/",
                            Proxy    = Info.Proxy
                        });
                    }
                    catch { }
                }
            }

            //下载视频
            //确定视频共有几个段落
            Info.PartCount = videos.Length;

            TipText("正在开始下载视频文件");

            //分段落下载
            for (int i = 0; i < videos.Length; i++)
            {
                //取得文件后缀名
                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(),
                                                Settings["title"] + ext),
                        //文件URL
                        Url = videos[i],
                        //代理服务器
                        Proxy = Info.Proxy
                    };
                }
                else                 //如果分段有多段
                {
                    currentParameter = new DownloadParameter()
                    {
                        //文件名 例: c:\123(1).flv
                        FilePath = Path.Combine(Info.SaveDirectory.ToString(),
                                                Settings["title"] + "(" + (i + 1).ToString() + ")" + ext),
                        //文件URL
                        Url = videos[i],
                        //代理服务器
                        Proxy = Info.Proxy
                    };
                }

                //添加文件路径到List<>中
                Info.FilePath.Add(currentParameter.FilePath);
                //下载文件
                bool success;

                //提示更换新Part
                NewPart(i + 1, videos.Length);

                //下载视频文件
                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;
                    }
                    else                     //否则继续下载,设置“部分失败”状态
                    {
                        Info.PartialFinished        = true;
                        Info.PartialFinishedDetail += "\r\n文件: " + currentParameter.Url + " 下载失败";
                    }
                }
            }

            //生成.acplay文件
            if (File.Exists(Path.Combine(Info.SaveDirectory.ToString(), Settings["title"] + ".json")))
            {
                var acplay = GenerateAcplayConfig(pr, Settings["title"]);
                if (!string.IsNullOrEmpty(acplay))
                {
                    Settings["AcPlay"] = acplay;
                }
            }


            //下载成功完成
            return(true);
        }