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); }
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); }