private async Task DownloadModule(RpcData rpcData, string courseDirectory, int moduleCounter, Module module) { var moduleDirectory = CreateModuleDirectory(courseDirectory, moduleCounter, module.Title); var course = rpcData.Payload.Course; var clipCounter = 0; string referrer = $"https://{Properties.Settings.Default.SiteHostName}/player?course={course.Name}&author={module.Author}&name={module.Name}&clip={clipCounter - 1}&mode=live"; HttpHelper httpHelper = new HttpHelper { AcceptEncoding = string.Empty, AcceptHeader = AcceptHeader.All, ContentType = ContentType.AppJsonUtf8, Cookies = Cookies, Referrer = new Uri(referrer), UserAgent = _userAgent }; foreach (var clip in module.Clips) { ++clipCounter; var postJson = BuildViewclipPostDataJson(rpcData, moduleCounter, clipCounter); var fileName = GetFullFileNameWithoutExtension(clipCounter, moduleDirectory, clip); if (!File.Exists($"{fileName}.{Properties.Settings.Default.ClipExtensionMp4}")) { ResponseEx viewclipResonse = await httpHelper.SendRequest(HttpMethod.Post, new Uri(Properties.Settings.Default.ViewClipUrl), postJson, Properties.Settings.Default.RetryOnRequestFailureCount, _token); if (viewclipResonse.Content == "Unauthorized") { throw new UnauthorizedException(Properties.Resources.CheckYourSubscription); } var clipFile = Newtonsoft.Json.JsonConvert.DeserializeObject <ClipFile>(viewclipResonse.Content); if (rpcData.Payload.Course.CourseHasCaptions) { string unformattedSubtitlesJson = await _subtitleService.DownloadAsync(httpHelper, module.Author, clipCounter - 1, module.Name, _token); Caption[] unformattedSubtitles = Newtonsoft.Json.JsonConvert.DeserializeObject <Caption[]>(unformattedSubtitlesJson); IList <SrtRecord> formattedSubtitles = GetFormattedSubtitles(unformattedSubtitles, clip.Duration); _subtitleService.Write($"{fileName}.{Properties.Settings.Default.SubtitilesExtensionMp4}", formattedSubtitles); } await DownloadClip(new Uri(clipFile.Urls[1].Url), fileName, clipCounter, rpcData.Payload.Course.Modules.Sum(m => m.Clips.Length)); } } }
private async Task DownloadModule(Course course, string courseDirectory, int moduleCounter, Module module) { var moduleDirectory = CreateModuleDirectory(courseDirectory, moduleCounter, module.Title); var clipCounter = 0; string referrer = $"https://{Settings.Default.SiteHostName}/player?course={course.Id}&author={module.AuthorId}&name={module.ModuleId}&clip=0&mode=live"; HttpHelper httpHelper = new HttpHelper { AcceptEncoding = string.Empty, AcceptHeader = AcceptHeader.All, ContentType = ContentType.AppJsonUtf8, Cookies = Cookies, Referrer = new Uri(referrer), UserAgent = _userAgent }; string moduleInfoPayload = GraphQlHelper.GetModuleInfoRequest(course.Id); ResponseEx courseRpcResponse = await httpHelper.SendRequest(HttpMethod.Post, new Uri("https://" + Settings.Default.SiteHostName + "/player/api/graphql"), moduleInfoPayload, Settings.Default.RetryOnRequestFailureCount, _token); CourseRpcData courceRpcData = JsonConvert.DeserializeObject <CourseRpcData>(courseRpcResponse.Content); foreach (var clip in module.Clips) { ++clipCounter; var fileName = GetFullFileNameWithoutExtension(clipCounter, moduleDirectory, clip); if (!File.Exists($"{fileName}.{Settings.Default.ClipExtensionMp4}")) { httpHelper.Referrer = new Uri($"https://{Settings.Default.SiteHostName}/player?course={course.Id}&author={module.AuthorId}&name={module.ModuleId}&clip=0&mode=live"); string s = GraphQlHelper.GetClipsRequest(courceRpcData, module.Id.Split('|')[1], module.Id.Split('|')[2], clipCounter - 1); ResponseEx viewclipResponse = await httpHelper.SendRequest(HttpMethod.Post, new Uri("https://" + Settings.Default.SiteHostName + "/player/api/graphql"), s, Settings.Default.RetryOnRequestFailureCount, _token); if (viewclipResponse.Content == "Unauthorized") { throw new UnauthorizedException(Resources.CheckYourSubscription); } var clipData = JsonConvert.DeserializeObject <ClipData>(viewclipResponse.Content); if (course.HasTranscript) { string unformattedSubtitlesJson = await _subtitleService.DownloadAsync(httpHelper, clip.ClipId.ToString(), _token); Caption[] unformattedSubtitles = JsonConvert.DeserializeObject <Caption[]>(unformattedSubtitlesJson); if (unformattedSubtitles.Length > 0) { TimeSpan totalDurationTs = XmlConvert.ToTimeSpan(clip.Duration); IList <SrtRecord> formattedSubtitles = GetFormattedSubtitles(unformattedSubtitles, totalDurationTs); _subtitleService.Write($"{fileName}.{Settings.Default.SubtitilesExtensionMp4}", formattedSubtitles); } } await DownloadClip(clipData.Data.ViewClip.Urls[1].UrlUrl, fileName, clipCounter, course.Modules.Sum(m => m.Clips.Length)); } } }
private async Task DownloadModule(RpcData rpcData, string courseDirectory, int moduleCounter, Module module) { var moduleDirectory = CreateModuleDirectory(courseDirectory, moduleCounter, module.Title); var course = rpcData.Payload.Course; var clipCounter = 0; string referrer = $"https://{Properties.Settings.Default.SiteHostName}/player?course={course.Name}&author={module.Author}&name={module.Name}&clip={clipCounter - 1}&mode=live"; HttpHelper httpHelper = new HttpHelper { AcceptEncoding = string.Empty, AcceptHeader = AcceptHeader.All, ContentType = ContentType.AppJsonUtf8, Cookies = Cookies, Referrer = new Uri(referrer), UserAgent = _userAgent }; foreach (var clip in module.Clips) { ++clipCounter; var s = GraphQl.GetClipsRequest(course, module, clipCounter - 1); var clipUrlResponse = await httpHelper.SendRequest(HttpMethod.Post, new Uri($"https://{Properties.Settings.Default.SiteHostName}/player/api/graphql"), s, Properties.Settings.Default.RetryOnRequestFailureCount, _token); dynamic courseExtraInfo = JsonConvert.DeserializeObject <ExpandoObject>(clipUrlResponse.Content, new ExpandoObjectConverter()); dynamic courseUrl; try { courseUrl = courseExtraInfo.data.viewClip.urls[0].url; } catch (Exception e) { var a = 42; throw; } var fileName = GetFullFileNameWithoutExtension(clipCounter, moduleDirectory, clip); if (!File.Exists($"{fileName}.{Properties.Settings.Default.ClipExtensionMp4}")) { if (rpcData.Payload.Course.CourseHasCaptions) { string unformattedSubtitlesJson = await _subtitleService.DownloadAsync(httpHelper, course.GetAuthorNameId(module.AuthorId), clipCounter - 1, module.ModuleId, clip.PureId, _token); Caption[] unformattedSubtitles = unformattedSubtitlesJson != "{\"message\":\"An error has occurred.\"}" ? JsonConvert.DeserializeObject <Caption[]>(unformattedSubtitlesJson) : new Caption[] { }; IList <SrtRecord> formattedSubtitles = unformattedSubtitles.Any() ? GetFormattedSubtitles(unformattedSubtitles, clip.Duration) : new List <SrtRecord>(); _subtitleService.Write($"{fileName}.{Properties.Settings.Default.SubtitilesExtensionMp4}", formattedSubtitles); } await DownloadClip( new Uri(courseUrl), fileName, clipCounter, rpcData.Payload.Course.Modules.Sum(m => m.Clips.Length)); } } }