async public Task <IResult <Episode> > PrepareDownloadEpisode(string Ep)
        {
            IResult <Episode> Donut = null;

            var Req = new RestRequest("/" + Ep);
            var Res = this._HttpClient.Get(Req);

            if (Res.StatusCode != System.Net.HttpStatusCode.OK)
            {
                Donut = Result.Fail <Episode>(Res.StatusDescription);
            }
            else
            {
                var Episode  = new Episode();
                var Document = await Res.Content.ConvertHTML();

                var EpID = Document.QuerySelector("#EpisodeId").Attributes["value"].Value;

                var FanSubsHTML = Document.QuerySelectorAll(".fansubSelector");

                Parallel.ForEach(FanSubsHTML, new ParallelOptions {
                    MaxDegreeOfParallelism = 5
                }, async FanSubHTML => {
                    var Fansub  = new Fansub();
                    Fansub.ID   = FanSubHTML.Attributes["data-fid"].Value;
                    Fansub.Name = FanSubHTML.Text().Trim().ClearHtmlTags();

                    var GetPlayersReq           = new RestRequest("/api/fansubSources");
                    GetPlayersReq.RequestFormat = DataFormat.Json;
                    GetPlayersReq.AddJsonBody(new { EpisodeId = EpID, FansubId = Fansub.ID });

                    var GetPlayersRes  = this._HttpClient.Post(GetPlayersReq);
                    var GetPlayersHTML = await GetPlayersRes.Content.ConvertHTML();

                    var PlayersHTML = GetPlayersHTML.QuerySelectorAll(".sourceBtn");

                    Parallel.ForEach(PlayersHTML, new ParallelOptions {
                        MaxDegreeOfParallelism = 5
                    }, async PlayerHTML => {
                        var Player = new Player();

                        Player.ID          = PlayerHTML.Attributes["data-id"].Value;
                        Player.Description = PlayerHTML.QuerySelector("p>small").Text().Trim().ClearHtmlTags();
                        PlayerHTML.QuerySelector("p>small").Remove();
                        Player.Name = PlayerHTML.QuerySelector("p").Text().Trim().ClearHtmlTags();

                        var GetPlayerSourceReq   = new RestRequest("api/sourcePlayer/" + Player.ID);
                        var GetPlayerSourcesRes  = this._HttpClient.Post(GetPlayerSourceReq);
                        var GetPlayerSourcesHTML = await JObject.Parse(GetPlayerSourcesRes.Content)["source"].ToString().ConvertHTML();

                        var Iframe = GetPlayerSourcesHTML.QuerySelector("iframe");

                        if (Iframe != null)
                        {
                            Player.Embed = Iframe.Attributes["src"].Value;
                        }
                        else
                        {
                            var A = GetPlayerSourcesHTML.QuerySelector("a");
                            if (A != null)
                            {
                                Player.Embed = A.Attributes["href"].Value;
                            }
                        }

                        if (Player.Embed != "")
                        {
                            var KucultName = Player.Name.ToLower();
                            if (KucultName == "gplus" || KucultName == "yandex" || KucultName == "mp4upload" || KucultName == "vidmoly" || KucultName == "videobin" || KucultName == "vidia")
                            {
                                var GetDownlandAbleClient = new RestClient("https://player.tranimeizle.com/");
                                var GetDownlandAble       = new RestRequest(Regex.Split(Player.Embed, "https://player.tranimeizle.com/")[1].ToString());
                                GetDownlandAble.AddHeader("referer", Res.ResponseUri.ToString());
                                var GetDownloadableRes = GetDownlandAbleClient.Get(GetDownlandAble);

                                if (GetDownloadableRes.StatusCode == System.Net.HttpStatusCode.OK)
                                {
                                    var GetDownloadableContent = GetDownloadableRes.Content.ClearHtmlTags();

                                    if (KucultName == "vidmoly")
                                    {
                                        var IframeRegex = new Regex("<iframe src=\"(.*?)\".*></iframe>");
                                        var Parse       = IframeRegex.Match(GetDownloadableContent);
                                        var Url         = Parse.Groups[1].Value;

                                        var MolyClient = new RestClient("https://vidmoly.me/");
                                        var MolyReq    = new RestRequest(Regex.Split(Url, "https://vidmoly.me/")[1].ToString());
                                        var MolyRes    = MolyClient.Get(MolyReq);

                                        if (MolyRes.StatusCode == System.Net.HttpStatusCode.OK)
                                        {
                                            var MolyContent = MolyRes.Content.ClearHtmlTags();

                                            var SourcesRegex = new Regex(@"sources: (\[.*?\])");
                                            var ParseSources = SourcesRegex.Match(MolyContent);
                                            var Json         = JsonConvert.DeserializeObject <List <Downloadable> >((ParseSources.Groups[1].Value).Replace("\t", "").Replace("\\", "").Trim());
                                            if (Json != null)
                                            {
                                                Player.Downloadables = Json;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        var SourcesRegex = new Regex(@"var sources = (\[.*?\])");
                                        var Parse        = SourcesRegex.Match(GetDownloadableContent);
                                        var Json         = JsonConvert.DeserializeObject <List <Downloadable> >((Parse.Groups[1].Value).Replace("\t", "").Replace("\\", "").Trim());
                                        if (Json != null)
                                        {
                                            Player.Downloadables = Json;
                                        }
                                    }
                                }
                            }
                            else if (KucultName == "sibnet")
                            {
                                var GetDownlandAbleClient             = new RestClient("https://video.sibnet.ru/");
                                GetDownlandAbleClient.FollowRedirects = false;
                                var GetDownlandAble    = new RestRequest(Regex.Split(Player.Embed, "https://video.sibnet.ru/")[1].ToString());
                                var GetDownloadableRes = GetDownlandAbleClient.Get(GetDownlandAble);
                                if (GetDownloadableRes.StatusCode == System.Net.HttpStatusCode.OK)
                                {
                                    var GetDownloadableContent = GetDownloadableRes.Content.ClearHtmlTags();

                                    var SourceRegex = new Regex(@"player.src\(\[{src: (.*?),.*,\]\)");
                                    var Parse       = SourceRegex.Match(GetDownloadableContent.ClearHtmlTags());

                                    var PlayerRedict = Parse.Groups[1].Value.Replace("\"", "");

                                    var GetMP4Req = new RestRequest(PlayerRedict);
                                    GetMP4Req.AddHeader("referer", Player.Embed);

                                    var GetMP4Res = GetDownlandAbleClient.Get(GetMP4Req);

                                    if (GetMP4Res.StatusCode == System.Net.HttpStatusCode.Redirect)
                                    {
                                        Player.Downloadables.Add(new Downloadable()
                                        {
                                            Name = "default",
                                            Url  = GetMP4Res.Headers.First(x => x.Name == "Location").Value.ToString()
                                        });
                                    }
                                }
                            }
                        }
                        Fansub.Players.Add(Player);
                    });
                    Episode.FanSubs.Add(Fansub);
                });

                Donut = Result.Success <Episode>(Episode);
            }


            return(Donut);
        }
Esempio n. 2
0
        private async Task <Subtitle> CreateInternal(SubtitleDTO subtitleDTO, Guid identityID, Episode episode, Fansub fansub, User user)
        {
            var subtitle = _unitOfWork.Subtitles.Create(new Subtitle
            {
                EpisodeID = episode.ID,
                FansubID  = fansub.ID,
                Status    = subtitleDTO.Status,
                Format    = subtitleDTO.Subtitle.GetSubtitleFormat(),
            });

            var subtitlePartial = _unitOfWork.SubtitlePartials.Create(new SubtitlePartial
            {
                UserID     = user.ID,
                SubtitleID = subtitle.ID,
            });

            _unitOfWork.Save();

            string subtitleUrl;

            try
            {
                subtitleUrl = await _unitOfWork.Storage.UploadSubtitle(subtitleDTO.Subtitle, fansub.ID, subtitle.ID);
            }
            catch (Exception ex)
            {
                // TODO: AZ to do this cleaning instead of on the call
                _logger.Emit(
                    ELoggingEvent.CantUploadSubtitle,
                    new {
                    subtitleDTO.AnimeSlug,
                    subtitleDTO.EpisodeNumber,
                    UserIdentityID = identityID,
                    Exception      = ex,
                }
                    );
                _unitOfWork.Subtitles.Delete(subtitle);
                _unitOfWork.SubtitlePartials.Delete(subtitlePartial);
                _unitOfWork.Save();
                throw;
            }

            string subtitlePartialUrl;

            try
            {
                subtitlePartialUrl = await _unitOfWork.Storage.UploadSubtitlePartial(subtitleDTO.Subtitle, fansub.ID, subtitle.ID, subtitlePartial.ID);
            }
            catch (Exception ex)
            {
                // TODO: AZ to do this cleaning instead of on the call
                _logger.Emit(
                    ELoggingEvent.CantUploadSubtitlePartial,
                    new
                {
                    subtitleDTO.AnimeSlug,
                    subtitleDTO.EpisodeNumber,
                    UserIdentityID = identityID,
                    Exception      = ex,
                }
                    );
                _unitOfWork.Subtitles.Delete(subtitle);
                _unitOfWork.SubtitlePartials.Delete(subtitlePartial);
                _unitOfWork.Save();

                _unitOfWork.Storage.DeleteSubtitle(fansub.ID, subtitle.ID);
                throw;
            }

            try
            {
                subtitle.Url        = subtitleUrl;
                subtitlePartial.Url = subtitlePartialUrl;
                _unitOfWork.Save();
            }
            catch (Exception ex)
            {
                // TODO: AZ to do this cleaning instead of on the call
                _logger.Emit(
                    ELoggingEvent.CantLinkSubtitleUrl,
                    new
                {
                    subtitleDTO.AnimeSlug,
                    subtitleDTO.EpisodeNumber,
                    UserIdentityID = identityID,
                    Exception      = ex,
                }
                    );
                _unitOfWork.Subtitles.Delete(subtitle);
                _unitOfWork.SubtitlePartials.Delete(subtitlePartial);
                _unitOfWork.Save();

                _unitOfWork.Storage.DeleteSubtitle(fansub.ID, subtitle.ID);
                _unitOfWork.Storage.DeleteSubtitlePartial(fansub.ID, subtitle.ID, subtitlePartial.ID);

                throw;
            }

            return(subtitle);
        }