Exemple #1
0
        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));
                }
            }
        }
Exemple #2
0
        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));
                }
            }
        }