public void AddChapter(string chapterName, string address) { NovelChapter nc = new NovelChapter(chapterName); nc.ChapterAddress = address; this.novelChapters.Add(nc); }
/// <summary> /// 从网站中获取指定章节的内容,返回章节内容的字节 /// </summary> /// <param name="needDownloadChapter"></param> /// <param name="request"></param> /// <param name="response"></param> /// <returns></returns> private string GetResponseStringFromServer(NovelChapter needDownloadChapter, HttpWebRequest request, HttpWebResponse response) { Stream dataStream = null; StreamReader reader = null; string responseFromServer = ""; for (int loop = 0; loop < this.repeatCount; loop++) { try { request = (HttpWebRequest)HttpWebRequest.Create(needDownloadChapter.ChapterAddress); request.Credentials = CredentialCache.DefaultCredentials; request.Timeout = 60000; response = (HttpWebResponse)request.GetResponse(); request.KeepAlive = false; dataStream = response.GetResponseStream(); reader = new StreamReader(dataStream, Encoding.Default); responseFromServer = reader.ReadToEnd(); if (responseFromServer == "") { continue; } if (regHtmlEnd.Match(responseFromServer).Success) { break; } else { continue; } } catch { responseFromServer = ""; Thread.Sleep(1000); } finally { if (reader != null) { reader.Close(); } if (dataStream != null) { dataStream.Close(); } if (response != null) { response.Close(); } if (request != null) { request.Abort(); } } } return(responseFromServer); }
/// <summary> /// 改变章节的获取状态 /// </summary> /// <param name="nc"></param> /// <param name="cs"></param> private void ChangeGetState(NovelChapter nc, ChapterState cs) { lock (this.thisLock) { nc.ChapterState = cs; } this.TellNovelDirectoryListUpdated(this); }
private void SaveResponseString(string handledString, NovelChapter nc, int fileIndex) { FileStream fs = System.IO.File.Create(this.novel.LocalFolder + "\\" + GenerateSaveFileName(fileIndex)); StreamWriter sw = new StreamWriter(fs); sw.Write(handledString); sw.Flush(); sw.Close(); fs.Close(); nc.FileName = GenerateSaveFileName(fileIndex); this.ChangeGetState(nc, ChapterState.完成); }
/// <summary> /// 获取要下载的章节对象 /// </summary> /// <returns></returns> private NovelChapter GetNeedDownloadChapter(ref int fileIndex) { NovelChapter needDownloadChapter = null; lock (this.thisLock) { for (int i = 0; i < this.novel.NovelChapters.Count; i++) { if (this.novel.NovelChapters[i].ChapterState == ChapterState.等待中) { fileIndex = i; needDownloadChapter = this.novel.NovelChapters[i]; needDownloadChapter.ChapterState = ChapterState.获取中; break; } } } this.TellNovelDirectoryListUpdated(this); return(needDownloadChapter); }
/// <summary> /// 获取章节内容线线程调用 /// </summary> private void GetContentDelegate() { HttpWebRequest request = null; HttpWebResponse response = null; int fileIndex = 0; //获取要下载的章节对象 NovelChapter needDownloadChapter = this.GetNeedDownloadChapter(ref fileIndex); while (needDownloadChapter != null) { //开始下载html文件任务 string responseFromServer = null; //获取指定章节页的网页源码 responseFromServer = this.GetResponseStringFromServer(needDownloadChapter, request, response); if (responseFromServer == null || responseFromServer == "") { this.ChangeGetState(needDownloadChapter, ChapterState.获取失败); } else { //对获取的网页源码作预处理 string preHandleString = this.PreHandleResponseString(responseFromServer); if (preHandleString == "") { this.ChangeGetState(needDownloadChapter, ChapterState.获取失败); } else { int index = preHandleString.IndexOf("<img"); if (index > 0) { this.DownloadAllChapterImg(needDownloadChapter, preHandleString, fileIndex); } else { this.SaveResponseString(this.LastHandleResponseString(preHandleString), needDownloadChapter, fileIndex); } } } Thread.Sleep(500); //判断是否要退出当前线程 string threadName = Thread.CurrentThread.Name; Trace.Write(threadName); Trace.Write(threadName.Substring(16, threadName.Length - 16)); if (threadName.StartsWith("GetContentThread")) { if (int.Parse(threadName.Substring(16, threadName.Length - 16)) > this.threadCount - 1) { break; } } if (this.isStopDownload) { break; } //如果当前活动线程数量大于已改变线程数量,则当前线程退出 if (this.activatedThreadCount > this.threadCount) { break; } //继续下一个章节下载 needDownloadChapter = this.GetNeedDownloadChapter(ref fileIndex); } lock (this.thisLock2) { this.activatedThreadCount--; if (this.activatedThreadCount == 0) { this.TellHasAllThreadStopped(this); } } }
/// <summary> /// 从网页内容中取出章节图片地址并下载 /// </summary> /// <param name="nc"></param> /// <param name="contentString"></param> private void DownloadAllChapterImg(NovelChapter nc, string contentString, int fileIndex) { Uri uri = new Uri(nc.ChapterAddress); WebClient webclient = new WebClient(); webclient.Credentials = CredentialCache.DefaultCredentials; string[] temp = contentString.Split(new string[] { "<img src=\"" }, StringSplitOptions.RemoveEmptyEntries); string imgFilesName = ""; //当前文件的名称(带后缀) string filenamewithExt = ""; string imgPath; bool downloadSuccess = false; for (int j = 0; j < temp.Length; j++) { imgPath = ""; filenamewithExt = ""; int index3 = temp[j].IndexOf('"'); if (index3 < 5) { continue; } string str = temp[j].Substring(0, index3); if (str.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) || str.EndsWith(".gif", StringComparison.OrdinalIgnoreCase)) { if (str.ToLower().StartsWith("http://")) { imgPath = str; } else if (str.StartsWith("/")) { imgPath = "http://" + uri.Host + str; } else { imgPath = nc.ChapterAddress.Substring(0, nc.ChapterAddress.LastIndexOf("/")) + "/" + str; } filenamewithExt = fileIndex.ToString() + "_" + j.ToString() + imgPath.Substring(imgPath.Length - 4, 4); for (int loop = 0; loop < this.repeatCount; loop++) { try { webclient.DownloadFile(imgPath, this.novel.LocalFolder + "\\" + filenamewithExt); downloadSuccess = true; break; } catch { Thread.Sleep(1000); } finally { } if (loop == 4) { downloadSuccess = false; } } if (imgFilesName == "") { imgFilesName = filenamewithExt; } else { imgFilesName = imgFilesName + "|" + filenamewithExt; } //如果其中一张图片下载失败,停止下载该章的其它图片 if (downloadSuccess == false) { break; } } } webclient.Dispose(); if (downloadSuccess) { nc.FileName = imgFilesName; this.ChangeGetState(nc, ChapterState.完成); } else { this.ChangeGetState(nc, ChapterState.获取失败); } }