Пример #1
0
		public static EditorResult Edit(VideoTask task) {
			using(TaskEditor te = new TaskEditor(task)) {
				if(te.ShowDialog() != DialogResult.OK)
					return EditorResult.Cancel;
				return te.cbSameForAll.Checked ? EditorResult.SameForAll : EditorResult.OK;
			}
		}
Пример #2
0
 public static void ReFetchTask(VideoTask task)
 {
     CreateTaskWithAid(task.Aid, task.Page);
     Data.ApplicationSettings.GetInstance().Dispatcher.Invoke(() => {
         Data.FetchingTasks.GetInstance().Tasks.Remove(task);
     });
 }
Пример #3
0
        public static void Build(FetcherTaskToken token)
        {
            var jsonVideoInfo = NetworkHelper.GetTextFromUri(token.ToUri());

            if (jsonVideoInfo.Length > 100)
            {
                var       videoInfo = JsonConvert.DeserializeObject <VideoInfo>(jsonVideoInfo);
                VideoTask newTask   = GetVideoTask(token, videoInfo);

                var settings = Data.ApplicationSettings.GetInstance();

                settings.Dispatcher.Invoke(delegate
                {
                    Data.FetchingTasks.AddTask(newTask);
                });

                var task = new Task(() => { GetDownloadUrl(newTask); });

                // TODO: 改用后台进程/进程池实现
                task.Start();
            }
            else
            {
                var errorMsg = JsonConvert.DeserializeObject <ServerSideException>(jsonVideoInfo);
                Data.NotificationData.AddErrorNotifiction(errorMsg);
            }
        }
Пример #4
0
        public static void Build(string aid, string page)
        {
            var jsonVideoInfo = Helper.NetworkHelper.GetTextFromUri(VIDEO_INFO_API + aid + "&page=" + page);

            if (jsonVideoInfo.Length > 100)
            {
                var       videoInfo = JsonConvert.DeserializeObject <jsonVideoInfo>(jsonVideoInfo);
                VideoTask newTask   = GetVideoTask(aid, page, videoInfo);

                var settings = Data.ApplicationSettings.GetInstance();

                settings.Dispatcher.Invoke(delegate
                {
                    Data.FetchingTasks.AddTask(newTask);
                });

                var task = new Task(() => { GetDownloadUrl(newTask); });

                // TODO: 改用后台进程/进程池实现
                task.Start();
            }
            else
            {
                var errorMsg = JsonConvert.DeserializeObject <jsonVideoInfoFailedMessage>(jsonVideoInfo);
                Data.NotificationData.AddErrorNotifiction("获取视频信息失败, 错误代号: " + errorMsg.code);
            }
        }
Пример #5
0
        public static void AddTask(VideoTask vt)
        {
            _instance.Tasks.Add(vt);

            // TODO: 将VideoTask添加到任务队列中,交由后台进程获取实际下载地址
            //TaskQueue.Enqueue(vt);
        }
        public static VideoInfoWindow Start(VideoTask task)
        {
            var win = new VideoInfoWindow();

            win.Task = task;
            win.Show();
            return(win);
        }
Пример #7
0
        private static void AppendFileSystemInfo(VideoTask newTask, jsonVideoDownload jvd)
        {
            var durl = jvd.durl[0];

            newTask.Size = Helper.FileHelper.GetFileSizeString(durl.size);
            newTask.DownloadUrl.Add(durl.url);
            newTask.DownloadUrl.AddRange(durl.backup_url);
            newTask.Name = newTask.Name.Substring(9);
        }
Пример #8
0
        private static void AppendFileSystemInfo(VideoTask newTask, jsonVideoDownload jvd)
        {
            var durl = jvd.durl[0];

            newTask.RawSize = durl.size;
            newTask.DownloadUrl.Add(durl.url);
            newTask.DownloadUrl.AddRange(durl.backup_url);
            newTask.State = FetchState.Done;
            //newTask.Name = newTask.Name.Substring(9);
        }
Пример #9
0
        /// <summary>
        /// 获取任务的大小和下载地址
        /// </summary>
        /// <param name="newTask"></param>
        private static void GetDownloadUrl(VideoTask newTask)
        {
            var cid = newTask.VideoInfo.cid;

            if (AdvanceSettings.UseNativeApi)
            {
                BilibiliVideoInfo info = GetVideoInfoFromNativeApi(cid);
                if (info.Code < 0)
                {
                    throw new ServerSideException(info.Code, info.Result);
                }
                AppendFileSystemInfo(newTask, info);
                return;
            }

            var settings = ApplicationSettings.GetInstance();
            var downJson = NetworkHelper.GetTextFromUri(
                DOWNLOAD_API + cid + "?quality=1&type=" + settings.FetchingOption.Format);

            if (downJson.Length < 100)
            {
                NotificationData.AddErrorNotifiction(
                    "无法获取cid:" + cid + "的下载地址, 可能是非bilibili源的缘故");
                newTask.State = FetchState.Error;
                return;
            }
            var jvd = JsonConvert.DeserializeObject <jsonVideoDownload>(downJson);

            if (settings.FetchingOption.Quality == "high")
            {
                var quality = jvd.accept_quality.OrderByDescending(t => t).First();
                downJson = NetworkHelper.GetTextFromUri(
                    DOWNLOAD_API + newTask.VideoInfo.cid + "?quality=" + quality);
                jvd = JsonConvert.DeserializeObject <jsonVideoDownload>(downJson);
            }

            if (jvd.durl.Count == 0)
            {
                NotificationData.AddErrorNotifiction(
                    "无法获取cid:" + cid + "的下载地址, durl.count = 0");
                newTask.State = FetchState.Error;
                return;
            }

            AppendFileSystemInfo(newTask, jvd);

            NotificationData.AddNotifiction(
                NotificationLevel.Info,
                "成功获取cid:" + cid + "的下载地址, 请复制下载地址到其它软件下载");
        }
Пример #10
0
        public async Task <VideoTask> CreateAsync(VideoTaskDto model)
        {
            var videoTask = new VideoTask
            {
                Name        = model.Name,
                Description = model.Description,
                VideoHref   = model.VideoHref,
                Module      = await _context.Modules.FindAsync(model.ModuleId)
            };

            _context.VideoTasks.Add(videoTask);
            await _context.SaveChangesAsync();

            return(videoTask);
        }
Пример #11
0
        private static VideoTask GetVideoTask(FetcherTaskToken token, VideoInfo videoInfo)
        {
            var newTask = new VideoTask(token)
            {
                VideoInfo = videoInfo,
                State     = FetchState.Waiting,

                Name     = videoInfo.title,
                Partname = videoInfo.partname,

                DownloadUrl = new List <string>(),
                Danmu       = "http://comment.bilibili.com/" + videoInfo.cid + ".xml"
            };

            return(newTask);
        }
Пример #12
0
        public static async void DownAndRegxFilt(VideoTask task, Regex regex)
        {
            if (task.Danmu == string.Empty)
            {
                Data.NotificationData.GetInstance().Add(
                    new NotifictionMessage(NotificationLevel.Warning, "下载地址尚未获取到, 请等待或删除本任务."));
                return;
            }

            Data.NotificationData.GetInstance().Add(new NotifictionMessage(NotificationLevel.Info,
                                                                           "正在下载并过滤弹幕...请稍等"));
            var thrTask = new Task <string>(delegate
            {
                var danmu = Helper.NetworkHelper.GetTextFromUri(task.Danmu);
                return(danmu);
            });

            thrTask.Start();
            var danmuXmlBytes = await thrTask;
            var xmlDanmu      = Helper.XmlSerializerHelper.XmlDeserialize <xmlDanmu>(danmuXmlBytes);

            RegxFilt(xmlDanmu, regex);

            var danmuXml = Helper.XmlSerializerHelper.XmlSerialize <xmlDanmu>(xmlDanmu);

            Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
            dlg.FileName   = "[弹幕]" + Helper.FileHelper.CleanInvalidFileName(task.Name); // Default file name
            dlg.DefaultExt = ".xml";                                                     // Default file extension
            dlg.Filter     = "Xml 格式弹幕 (.xml)|*.xml";                                    // Filter files by extension

            // Show save file dialog box
            bool?  result   = dlg.ShowDialog();
            string filename = string.Empty;

            // Process save file dialog box results
            if (result == true)
            {
                File.WriteAllText(dlg.FileName, danmuXml);
                Data.NotificationData.GetInstance().Add(
                    new NotifictionMessage(NotificationLevel.Info, "弹幕已保存到" + dlg.FileName));
            }
            else
            {
                return;
            }
        }
Пример #13
0
        private static void AppendFileSystemInfo(VideoTask newTask, BilibiliVideoInfo info)
        {
            int           rawSize = 0;
            StringBuilder builder = new StringBuilder();

            foreach (var item in info.Durls)
            {
                rawSize += item.Size;
                builder.AppendLine(item.Url);
            }
            var durl = info.Durls[0];

            newTask.RawSize = rawSize;
            newTask.DownloadUrl.Add(builder.ToString().TrimEnd('\r', '\n'));
            //newTask.DownloadUrl.AddRange(durl.BackupUrl);
            newTask.State = FetchState.Done;
            //newTask.Name = newTask.Name.Substring(9);
        }
Пример #14
0
		public TaskEditor(VideoTask task) {
			InitializeComponent();
			_task = task;
			this.Text = task.FileFullPath;
			tbFile.Text = task.FileFullPath;
			cbMP4.Checked = task.MP4;
			cbFLV.Checked = task.FLV;
			cbWEBM.Checked = task.WEBM;
			cbMP3.Checked = task.MP3;
			tbvbmp4.Text = task.MP4_bv;
			tbvbwebm.Text = task.WEBM_bv;
			tbvbflv.Text = task.FLV_bv;
			tbabmp4.Text = task.MP4_ba;
			tbabwebm.Text = task.WEBM_ba;
			tbabflv.Text = task.FLV_ba;
			tbabmp3.Text = task.MP3_ba;
			tbsrflv.Text = task.FLV_sr;
			tbsrmp3.Text = task.MP3_sr;
			cbNoSound.Checked = task.NoSound;
			cbReplace.Checked = task.WebChar;
			cbPoster.Checked = task.Poster;
			cbJSON.Checked = task.Json;
			cbTN.Checked = task.Thumbnail;
			cbIncTime.Checked = task.LengthOnTn;
			cbOW.Checked = task.Overwrite;
			cbRotate.SelectedIndex = task.Rotate;
			tbWidth.Text = task.ResizeWidth;
			tbHeight.Text = task.ResizeHeight;
			nudStartOffset.Value = task.StartOffset;
			nudEndOffset.Value = task.EndOffset;
			nudMinWidth.Value = task.TnWidth;
			nudMinHeight.Value = task.TnHeight;
			cbOL1.SelectedIndex = task.Overlays[0].Item1;
			cbOL2.SelectedIndex = task.Overlays[1].Item1;
			cbOL3.SelectedIndex = task.Overlays[2].Item1;
			cbOL4.SelectedIndex = task.Overlays[3].Item1;
			tbOL1.Text = task.Overlays[0].Item2;
			tbOL2.Text = task.Overlays[1].Item2;
			tbOL3.Text = task.Overlays[2].Item2;
			tbOL4.Text = task.Overlays[3].Item2;
		}
Пример #15
0
        private static VideoTask GetVideoTask(string aid, string page, jsonVideoInfo videoInfo)
        {
            var newTask = new VideoTask();

            newTask.VideoInfo = videoInfo;
            if (string.IsNullOrEmpty(videoInfo.partname))
            {
                newTask.Name     = $"(获取下载地址中){videoInfo.title}";
                newTask.Partname = "无";
            }
            else
            {
                newTask.Name     = $"(获取下载地址中){videoInfo.title} {videoInfo.partname}";
                newTask.Partname = videoInfo.partname;
            }

            newTask.Aid         = aid;
            newTask.Size        = "获取中";
            newTask.CreateTime  = DateTime.Now.ToString();
            newTask.DownloadUrl = new List <string>();
            newTask.Page        = page;
            newTask.Danmu       = "http://comment.bilibili.com/" + videoInfo.cid + ".xml";
            return(newTask);
        }
Пример #16
0
        /// <summary>
        /// 获取任务的大小和下载地址
        /// </summary>
        /// <param name="newTask"></param>
        private static void GetDownloadUrl(VideoTask newTask)
        {
            var settings = Data.ApplicationSettings.GetInstance();
            var cid      = newTask.VideoInfo.cid;
            var downJson = Helper.NetworkHelper.GetTextFromUri(
                DOWNLOAD_API + cid + "?quality=1&type=" + settings.FetchingOption.Format);

            if (downJson.Length < 100)
            {
                Data.NotificationData.AddErrorNotifiction(
                    "无法获取cid:" + cid + "的下载地址, 可能是非bilibili源的缘故");
                return;
            }
            var jvd = JsonConvert.DeserializeObject <jsonVideoDownload>(downJson);

            if (settings.FetchingOption.Quality == "high")
            {
                var quality = jvd.accept_quality.OrderByDescending(t => t).First();
                downJson = Helper.NetworkHelper.GetTextFromUri(
                    DOWNLOAD_API + newTask.VideoInfo.cid + "?quality=" + quality);
                jvd = JsonConvert.DeserializeObject <jsonVideoDownload>(downJson);
            }

            if (jvd.durl.Count == 0)
            {
                Data.NotificationData.AddErrorNotifiction(
                    "无法获取cid:" + cid + "的下载地址, durl.count = 0");
                return;
            }

            AppendFileSystemInfo(newTask, jvd);

            Data.NotificationData.AddNotifiction(
                NotificationLevel.Info,
                "成功获取cid:" + cid + "的下载地址, 请复制下载地址到其它软件下载");
        }
 public FetcherTaskToken(VideoTask vk) : this(vk.Aid, vk.Page, vk)
 {
 }
 public FetcherTaskToken(string aid, int partIndex, VideoTask vk)
 {
     this.Aid       = aid;
     this.PartIndex = partIndex;
     this.Task      = vk;
 }
Пример #19
0
 public void UpdateVideoTask(VideoTask task)
 {
     _context.VideoTasks.Update(task);
     _context.SaveChanges();
 }
Пример #20
0
 public async Task Remove(VideoTask videoTask)
 {
     _context.VideoTasks.Remove(videoTask);
     await _context.SaveChangesAsync();
 }
Пример #21
0
		public static void Gui(IList<string> files, bool transform = false) {
			if(transform) {
				List<VideoTask> tasks = new List<VideoTask>();
				foreach(string file in files) {
					if(!File.Exists(file))
						continue;
					VideoTask task = new VideoTask() {
						FileFullPath = file,
						LengthOnTn = true,
						MP4 = true,
						MP4_ba = "128k",
						MP4_bv = "5000k",
						Overwrite = true
					};
					tasks.Add(task);
				}
				(new MainForm(tasks)).ShowDialog();
			} else {
				(new MainForm(files)).ShowDialog();
			}
		}
Пример #22
0
		private void AddItems(IList<string> items) {
			VideoTask tskForCopy = null;
			foreach(string file in items) {
				bool equals = false;
				foreach(string itm in LB.Items) {
					if(file.Equals(itm, StringComparison.CurrentCultureIgnoreCase)) {
						equals = true;
						break;
					}
				}
				if(equals)
					continue;
				
				if(tskForCopy == null) {
					VideoTask tsk = new VideoTask() { FileFullPath = file, LengthOnTn = true };
					switch(TaskEditor.Edit(tsk)) {
						case EditorResult.OK:
							LB.Items.Add(file);
							Tasks.Add(tsk);
							break;
							
						case EditorResult.SameForAll:
							LB.Items.Add(file);
							Tasks.Add(tsk);
							tskForCopy = tsk.Clone();
							break;
					}
				} else {
					VideoTask tsk = tskForCopy.Clone();
					tsk.FileFullPath = file;
					LB.Items.Add(file);
					Tasks.Add(tsk);
				}
			}
		}