public void 载结束提醒(bool 是否结束弹幕录制, string 提醒标题 = "下载任务结束") { try { if (是否结束弹幕录制 && MMPU.录制弹幕 && MMPU.弹幕录制种类 == 2) { try { DownIofo.弹幕储存流.WriteLine("</i>"); DownIofo.弹幕储存流.Flush();//写入弹幕数据 } catch (Exception) { } Clear(false); } else { Clear(true); } } catch (Exception) { } InfoLog.InfoPrintf($"\n=============={提醒标题}================\n" + $"主播名:{DownIofo.主播名称}" + $"\n房间号:{DownIofo.房间_频道号}" + $"\n标题:{DownIofo.标题}" + $"\n开播时间:{MMPU.Unix转换为DateTime(DownIofo.开始时间.ToString())}" + $"\n结束时间:{MMPU.Unix转换为DateTime(DownIofo.结束时间.ToString())}" + $"\n保存路径:{DownIofo.文件保存路径}" + $"\n下载任务类型:{(DownIofo.继承.是否为继承对象 ? "续下任务" : "新建下载任务")}" + $"\n结束原因:{DownIofo.备注}" + $"\n==============={提醒标题}===============\n", InfoLog.InfoClass.载必要提示); }
public string Start(string 开始后显示的备注) { DownIofo.开始时间 = Gettime(); MMPU.DownList.Add(this); int a = 0; DownIofo.WC = new WebClient(); DownIofo.WC.Headers.Add("Accept: */*"); DownIofo.WC.Headers.Add("User-Agent: " + MMPU.UA.Ver.UA()); DownIofo.WC.Headers.Add("Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,ja;q=0.4"); DownIofo.WC.DownloadFileCompleted += 载完成事件; DownIofo.WC.DownloadProgressChanged += 载过程中事件; DownIofo.WC.Headers.Add("Accept-Encoding: gzip, deflate, br"); DownIofo.WC.Headers.Add("Cache-Control: max-age=0"); DownIofo.WC.Headers.Add("Sec-Fetch-Mode: navigate"); DownIofo.WC.Headers.Add("Sec-Fetch-Site: none"); DownIofo.WC.Headers.Add("Sec-Fetch-User: ?1"); DownIofo.WC.Headers.Add("Upgrade-Insecure-Requests: 1"); DownIofo.WC.Headers.Add("Cache-Control: max-age=0"); DownIofo.WC.Headers.Add("Referer: https://www.bilibili.com/"); if (!string.IsNullOrEmpty(MMPU.Cookie)) { DownIofo.WC.Headers.Add("Cookie", MMPU.Cookie); } if (!Directory.Exists(GetDirectoryName(DownIofo.文件保存路径))) { Directory.CreateDirectory(GetDirectoryName(DownIofo.文件保存路径)); } // ReSharper restore AssignNullToNotNullAttribute DownIofo.备注 = "等待接收直播数据流"; DownIofo.载状态 = true; MMPU.判断网络路径是否存在 判断文件是否存在 = new MMPU.判断网络路径是否存在(); while (true) { Thread.Sleep(5000); switch (DownIofo.平台) { case "bilibili": if (!bilibili.根据房间号获取房间信息.是否正在直播(DownIofo.房间_频道号, true)) { InfoLog.InfoPrintf(DownIofo.房间_频道号 + "房间:" + DownIofo.主播名称 + " 房间直播状态为False,取消建立新的下载任务", InfoLog.InfoClass.载必要提示); DownIofo.载状态 = false; DownIofo.备注 = "该房间未直播"; DownIofo.结束时间 = Convert.ToInt32((DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds); MMPU.DownList.Remove(this); return(null); } break; case "主站视频": break; default: DownIofo.载状态 = false; DownIofo.结束时间 = Convert.ToInt32((DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds); DownIofo.备注 = "不支持的平台"; MMPU.DownList.Remove(this); return(null); } if (判断文件是否存在.判断(DownIofo.载地址, DownIofo.平台, DownIofo.房间_频道号)) { break; } else { Thread.Sleep(5000); switch (DownIofo.平台) { case "bilibili": { if (bilibili.根据房间号获取房间信息.是否正在直播(DownIofo.房间_频道号, true)) { a++; if (判断文件是否存在.判断(DownIofo.载地址, DownIofo.平台, DownIofo.房间_频道号)) { //DownIofo.下载地址 = bilibili.根据房间号获取房间信息.下载地址(DownIofo.房间_频道号); break; } else { DownIofo.载地址 = bilibili.根据房间号获取房间信息.载地址(DownIofo.房间_频道号); if (判断文件是否存在.判断(DownIofo.载地址, DownIofo.平台, DownIofo.房间_频道号)) { break; } else { DownIofo.备注 = "等待房间推流..."; Thread.Sleep(30000); //return null; } } } else { InfoLog.InfoPrintf(DownIofo.房间_频道号 + "房间:" + DownIofo.主播名称 + " 房间未直播,下载任务取消", InfoLog.InfoClass.载必要提示); DownIofo.载状态 = false; DownIofo.备注 = "该房间未直播"; DownIofo.结束时间 = Convert.ToInt32((DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds); MMPU.DownList.Remove(this); if (DownIofo.继承.是否为继承对象) { //MMPU.弹窗.Add(3000, "重连任务取消", DownIofo.房间_频道号 + ",该房间未直播"); } else { MMPU.弹窗.Add(3000, "下载任务取消", DownIofo.房间_频道号 + ",该房间未直播"); } return(null); } break; } case "主站视频": { break; } } } } DownIofo.开始时间 = Convert.ToInt32((DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds); try { DownIofo.WC.DownloadFileTaskAsync(new Uri(DownIofo.载地址), DownIofo.文件保存路径); InfoLog.InfoPrintf(DownIofo.主播名称 + "开始直播,建立下载任务\r\n==============建立下载任务================\r\n主播名:" + DownIofo.主播名称 + "\r\n房间号:" + DownIofo.房间_频道号 + "\r\n标题:" + DownIofo.标题 + "\r\n开播时间:" + MMPU.Unix转换为DateTime(DownIofo.开始时间.ToString()) + "\r\n保存路径:" + DownIofo.文件保存路径 + "\r\n下载任务类型:" + (DownIofo.继承.是否为继承对象 ? "续下任务" : "新建下载任务") + "\r\n===============建立下载任务===============\r\n", InfoLog.InfoClass.载必要提示); if (MMPU.录制弹幕 && !DownIofo.继承.是否为继承对象) { DownIofo.弹幕储存流 = new StreamWriter(DownIofo.文件保存路径.Substring(0, DownIofo.文件保存路径.Length - 4) + (MMPU.弹幕录制种类 == 1 ? ".ass" : ".xml")); DownIofo.礼物储存流 = new StreamWriter(DownIofo.文件保存路径 + ".txt"); DownIofo.阿B直播流对象.Connect(int.Parse(DownIofo.房间_频道号)); DownIofo.阿B直播流对象.MessageReceived += Listener_MessageReceived; DownIofo.弹幕储存流.WriteLine(danmu.返回ASS字幕文件头(DownIofo.标题, DownIofo.房间_频道号, DownIofo.主播名称)); } } catch (WebException) { DownIofo.备注 = "主播未推流,已结束直播"; DownIofo.载状态 = false; return(null); } DownIofo.备注 = 开始后显示的备注; DownIofo.载状态 = true; return(DownIofo.文件保存路径); }
/// <summary> /// 返回下载列表HTML字符串 /// </summary> /// <returns></returns> public static string DownloaderInfoPrintf() { string 返回字符串 = "<html><head><title>%title%</title><meta charset=\"utf-8\"></head><body><table border=\"5\">"; List <string> 载任务 = new List <string>(); int 计数 = 1; int 完成数量 = 0; int 正在下载数量 = 0; 载任务.Add(string.Format("<tr><td>序号</td><td>房间号</td><td>下载状态</td><td>已下载大小</td><td>备注</td><td>主播名称</td><td>开始时间</td><td>结束时间</td></td>")); foreach (var item in MMPU.DownList) { 载任务.Add(string.Format("<tr><td>" + 计数 + "</td><td>" + item.DownIofo.房间_频道号 + "</td><td>" + (item.DownIofo.备注.Contains("断开")? "■下载完成" : (item.DownIofo.载状态 ? "□正在下载" : "■下载完成")) + "</td><td> " + item.DownIofo.已下载大小str + "</td><td>" + item.DownIofo.备注 + "</td><td>" + item.DownIofo.主播名称 + "</td><td>" + MMPU.Unix转换为DateTime(item.DownIofo.开始时间.ToString()) + "</td><td>" + MMPU.Unix转换为DateTime(item.DownIofo.结束时间.ToString()) + "</td></td>")); 计数++; if (item.DownIofo.载状态) { 正在下载数量++; } else { 完成数量++; } } for (int i = 0; i < 载任务.Count; i++) { 返回字符串 += 载任务[i]; } 返回字符串 = (返回字符串 + "</table></body></html>").Replace("%title%", "正在下载:" + 正在下载数量 + " 已经完成:" + 完成数量); return(返回字符串); }
// public event EventHandler<EventArgs> DownUpdate; // public event EventHandler<EventArgs> DownOk; private void 载完成事件(object sender, AsyncCompletedEventArgs e) { WebClient WWC = (WebClient)sender; new Task((() => { DownIofo.载状态 = false; DownIofo.结束时间 = Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds); DownIofo.备注 = "下载任务结束"; // if (e.Error != null && e.Error.) //Clipboard.SetDataObject(e.Error.Message); if (e.Cancelled) { DownIofo.备注 = "用户取消,停止下载"; if (!DownIofo.播放状态 && DownIofo.是否是播放任务) { DownIofo.备注 = "播放窗口关闭"; InfoLog.InfoPrintf("下载任务结束\n==============下载任务结束================\n主播名:" + DownIofo.主播名称 + "\n房间号:" + DownIofo.房间_频道号 + "\n标题:" + DownIofo.标题 + "\n开播时间:" + MMPU.Unix转换为DateTime(DownIofo.开始时间.ToString()) + "\n结束时间:" + MMPU.Unix转换为DateTime(DownIofo.结束时间.ToString()) + "\n保存路径:" + DownIofo.文件保存路径 + "\n下载任务类型:" + (DownIofo.继承.是否为继承对象 ? "续下任务" : "新建下载任务") + "\n结束原因:" + DownIofo.备注 + "\n===============下载任务结束===============\n", InfoLog.InfoClass.载必要提示); if (DownIofo.阿B直播流对象 != null && DownIofo.阿B直播流对象.startIn) { DownIofo.阿B直播流对象.Dispose(); } return; } } else if (e.Cancelled == false && !bilibili.根据房间号获取房间信息.是否正在直播(DownIofo.房间_频道号)) { DownIofo.备注 = "直播停止,下载完成下载完成"; InfoLog.InfoPrintf("下载任务结束\n==============下载任务结束================\n主播名:" + DownIofo.主播名称 + "\n房间号:" + DownIofo.房间_频道号 + "\n标题:" + DownIofo.标题 + "\n开播时间:" + MMPU.Unix转换为DateTime(DownIofo.开始时间.ToString()) + "\n结束时间:" + MMPU.Unix转换为DateTime(DownIofo.结束时间.ToString()) + "\n保存路径:" + DownIofo.文件保存路径 + "\n下载任务类型:" + (DownIofo.继承.是否为继承对象 ? "续下任务" : "新建下载任务") + "\n结束原因:" + DownIofo.备注 + "\n===============下载任务结束===============\n", InfoLog.InfoClass.载必要提示); if (DownIofo.继承 == null) { DownIofo.继承.是否为继承对象 = false; } if (DownIofo.继承.是否为继承对象 && !DownIofo.是否是播放任务) { DownIofo.继承.合并后的文件路径 = 载完成合并FLV(DownIofo.继承.继承的下载文件路径, DownIofo.文件保存路径, true); if (!string.IsNullOrEmpty(DownIofo.继承.合并后的文件路径)) { DownIofo.文件保存路径 = DownIofo.继承.合并后的文件路径; } } else if (!DownIofo.是否是播放任务) { FlvMethod.转码(DownIofo.文件保存路径); } InfoLog.InfoPrintf(DownIofo.房间_频道号 + "房间:" + DownIofo.主播名称 + " 下播,录制完成", InfoLog.InfoClass.载必要提示); if (DownIofo.阿B直播流对象 != null && DownIofo.阿B直播流对象.startIn) { DownIofo.阿B直播流对象.Dispose(); } foreach (var item in RoomInit.bilibili房间主表) { if (item.唯一码 == DownIofo.房间_频道号) { item.直播状态 = false; break; } } return; } else { if (bilibili.根据房间号获取房间信息.是否正在直播(DownIofo.房间_频道号) && DownIofo.是否保存) { DownIofo.备注 = "下载流断开,但检测到房间仍为开播状态,已新建续下任务"; DownIofo.载状态 = false; DownIofo.结束时间 = Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds); switch (DownIofo.平台) { case "bilibili": { if (DownIofo.继承.是否为继承对象 && !DownIofo.是否是播放任务) { DownIofo.继承.合并后的文件路径 = 载完成合并FLV(DownIofo.继承.继承的下载文件路径, DownIofo.文件保存路径, false); if (!string.IsNullOrEmpty(DownIofo.继承.合并后的文件路径)) { DownIofo.文件保存路径 = DownIofo.继承.合并后的文件路径; } } Downloader 载对象 = Downloader.新建下载对象( DownIofo.平台, DownIofo.房间_频道号, bilibili.根据房间号获取房间信息.获取标题(DownIofo.房间_频道号), Guid.NewGuid().ToString(), bilibili.根据房间号获取房间信息.载地址(DownIofo.房间_频道号), "重连", DownIofo.是否保存, DownIofo.主播名称, true, DownIofo.文件保存路径 ); if (!载对象.DownIofo.载状态) { 载对象.DownIofo.弹幕录制基准时间 = DownIofo.弹幕录制基准时间; 载对象.DownIofo.阿B直播流对象 = DownIofo.阿B直播流对象; 载对象.DownIofo.弹幕储存流 = DownIofo.弹幕储存流; 载对象.DownIofo.载状态 = false; 载对象.DownIofo.结束时间 = Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds); 载对象.DownIofo.备注 = "服务器主动断开连接,直播结束"; foreach (var item in RoomInit.bilibili房间主表) { if (item.唯一码 == DownIofo.房间_频道号) { item.直播状态 = false; break; } } if (DownIofo.继承.是否为继承对象 && !DownIofo.是否是播放任务) { DownIofo.继承.合并后的文件路径 = 载完成合并FLV(DownIofo.继承.继承的下载文件路径, DownIofo.文件保存路径, true); if (!string.IsNullOrEmpty(DownIofo.继承.合并后的文件路径)) { DownIofo.文件保存路径 = DownIofo.继承.合并后的文件路径; } } else if (!DownIofo.是否是播放任务) { FlvMethod.转码(DownIofo.文件保存路径); } InfoLog.InfoPrintf("下载任务结束\n==============下载任务结束================\n主播名:" + DownIofo.主播名称 + "\n房间号:" + DownIofo.房间_频道号 + "\n标题:" + DownIofo.标题 + "\n开播时间:" + MMPU.Unix转换为DateTime(DownIofo.开始时间.ToString()) + "\n结束时间:" + MMPU.Unix转换为DateTime(DownIofo.结束时间.ToString()) + "\n保存路径:" + DownIofo.文件保存路径 + "\n下载任务类型:" + (DownIofo.继承.是否为继承对象 ? "续下任务" : "新建下载任务") + "\n结束原因:" + DownIofo.备注 + "\n===============下载任务结束===============\n", InfoLog.InfoClass.载必要提示); 载对象.DownIofo.载状态 = false; 载对象.DownIofo.结束时间 = Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds); DownIofo.载状态 = false; DownIofo.结束时间 = Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds); return; } new Task((() => { while (true) { Thread.Sleep(1000); if (载对象.DownIofo.已下载大小bit > 1000) { DownIofo.载状态 = true; return; } if (!bilibili.根据房间号获取房间信息.是否正在直播(DownIofo.房间_频道号)) { InfoLog.InfoPrintf("下载任务结束\n==============下载任务结束================\n主播名:" + DownIofo.主播名称 + "\n房间号:" + DownIofo.房间_频道号 + "\n标题:" + DownIofo.标题 + "\n开播时间:" + MMPU.Unix转换为DateTime(DownIofo.开始时间.ToString()) + "\n结束时间:" + MMPU.Unix转换为DateTime(DownIofo.结束时间.ToString()) + "\n保存路径:" + DownIofo.文件保存路径 + "\n下载任务类型:" + (DownIofo.继承.是否为继承对象 ? "续下任务" : "新建下载任务") + "\n结束原因:" + DownIofo.备注 + "\n===============下载任务结束===============\n", InfoLog.InfoClass.载必要提示); 载对象.DownIofo.备注 = "停止直播"; 载对象.DownIofo.载状态 = false; 载对象.DownIofo.结束时间 = Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds); DownIofo.载状态 = false; DownIofo.结束时间 = Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds); 载对象.DownIofo.WC.CancelAsync(); MMPU.DownList.Remove(载对象); return; } } })).Start(); break; } //case "youtube": // { // break; // } //case "T台": // { // break; // } //case "FC2": // { // break; // } //case "DDTV直播服务器": // { // break; // } default: DownIofo.载状态 = false; DownIofo.结束时间 = Convert.ToInt32((DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalSeconds); InfoLog.InfoPrintf("该房间的配置文件发现了与当前版本不支持的平台,请检查文件配置或者检查更新", InfoLog.InfoClass.系统错误信息); return; } } else { DownIofo.备注 = "直播停止,下载完成下载完成"; InfoLog.InfoPrintf("下载任务结束\n==============下载任务结束================\n主播名:" + DownIofo.主播名称 + "\n房间号:" + DownIofo.房间_频道号 + "\n标题:" + DownIofo.标题 + "\n开播时间:" + MMPU.Unix转换为DateTime(DownIofo.开始时间.ToString()) + "\n结束时间:" + MMPU.Unix转换为DateTime(DownIofo.结束时间.ToString()) + "\n保存路径:" + DownIofo.文件保存路径 + "\n下载任务类型:" + (DownIofo.继承.是否为继承对象 ? "续下任务" : "新建下载任务") + "\n结束原因:" + DownIofo.备注 + "\n===============下载任务结束===============\n", InfoLog.InfoClass.载必要提示); if (DownIofo.阿B直播流对象 != null && DownIofo.阿B直播流对象.startIn) { DownIofo.阿B直播流对象.Dispose(); } return; } } })).Start(); }
public static Downloader 新建下载对象(string 平台, string 唯一码, string 标题, string GUID, string 载地址, string 备注, bool 是否保存, string 主播名称, bool 是否为继承项目, string 继承项目的原始文件) { Downloader 载对象 = new Downloader(); 载对象.DownIofo.继承 = new 继承(); string 缓存路径 = MMPU.缓存路径; string 保存路径; if (MMPU.载储存目录 == 缓存路径) { 保存路径 = 缓存路径 + 平台 + "_" + 主播名称 + "_" + 唯一码 + "/"; if (Directory.Exists(保存路径))//如果不存在就创建文件夹 { Directory.CreateDirectory(保存路径); } 保存路径 = 保存路径 + 标题 + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".flv"; } else { 保存路径 = MMPU.载储存目录 + "/" + 平台 + "_" + 主播名称 + "_" + 唯一码 + "/"; if (!Directory.Exists(保存路径))//如果不存在就创建file文件夹 { try { Directory.CreateDirectory(保存路径); } catch (Exception) { MMPU.载储存目录 = 缓存路径; MMPU.setFiles("file", MMPU.载储存目录); 保存路径 = MMPU.载储存目录 + "/" + 平台 + "_" + 主播名称 + "_" + 唯一码 + "/"; } } 保存路径 = 保存路径 + 标题 + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".flv"; if (File.Exists(保存路径)) { Thread.Sleep(1); 保存路径 = MMPU.载储存目录 + "/" + 平台 + "_" + 主播名称 + "_" + 唯一码 + "/" + 标题 + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".flv"; } } switch (平台) { case "bilibili": { 载地址 = 载地址; break; } case "youtube": { break; } } 载对象.DownIofo = new Downloader.DownIofoData { 平台 = 平台, 房间_频道号 = 唯一码, 文件保存路径 = 保存路径, 事件GUID = GUID, 载地址 = 载地址, 是否保存 = 是否保存, 标题 = 标题, 备注 = 备注, 主播名称 = 主播名称, 继承 = new 继承() { 是否为继承对象 = 是否为继承项目, 继承的下载文件路径 = 继承项目的原始文件, } }; if (!是否保存) { int 随机值 = new Random().Next(1000, 9999); 载对象.DownIofo.文件保存路径 = 缓存路径 + "LiveCache/" + 载对象.DownIofo.标题 + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "_" + 随机值 + ".flv"; if (File.Exists(载对象.DownIofo.文件保存路径)) { 载对象.DownIofo.文件保存路径 = 缓存路径 + "LiveCache/" + 载对象.DownIofo.标题 + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "_" + (随机值) + 1 + ".flv"; } } MMPU.DownList.Add(载对象); 载对象.Start(备注); InfoLog.InfoPrintf(主播名称 + "开始直播,建立下载任务\n==============建立下载任务================\n主播名:" + 载对象.DownIofo.主播名称 + "\n房间号:" + 唯一码 + "\n标题:" + 标题 + "\n开播时间:" + MMPU.Unix转换为DateTime(载对象.DownIofo.开始时间.ToString()) + "\n保存路径:" + 载对象.DownIofo.文件保存路径 + "\n下载任务类型:" + (载对象.DownIofo.继承.是否为继承对象 ? "续下任务" : "新建下载任务") + "\n===============建立下载任务===============\n", InfoLog.InfoClass.载必要提示); return(载对象); }