void SortByMultipleColumns()
            {
                int[] sortedColumns = multiColumnHeader.state.sortedColumns;

                if (sortedColumns.Length == 0)
                {
                    return;
                }

                IEnumerable <TreeViewItem <MIC_TreeViewElement> >        myTypes      = rootItem.children.Cast <TreeViewItem <MIC_TreeViewElement> >();
                IOrderedEnumerable <TreeViewItem <MIC_TreeViewElement> > orderedQuery = InitialOrder(myTypes, sortedColumns);

                for (int i = 1; i < sortedColumns.Length; i++)
                {
                    SortOption sortOption = c_sortOptionsPerColumn[sortedColumns[i]];
                    bool       ascending  = multiColumnHeader.IsSortedAscending(sortedColumns[i]);

                    switch (sortOption)
                    {
                    case SortOption.ID:
                        orderedQuery = orderedQuery.ThenBy(l => l.data.id, ascending);
                        break;

                    case SortOption.Path:
                        orderedQuery = orderedQuery.ThenBy(l => l.data.Path, ascending);
                        break;

                    case SortOption.ShaderName:
                        orderedQuery = orderedQuery.ThenBy(l => l.data.ShaderName, ascending);
                        break;
                    }
                }

                rootItem.children = orderedQuery.Cast <TreeViewItem>().ToList();
            }
示例#2
0
        public void Sort <TElement>(IComparer <TElement>[] comparers)
        {
            if (comparers?.Count() == 0)
            {
                return;
            }

            IOrderedEnumerable <TElement> OrderedThis = this.Cast <TElement>().OrderBy(m => m, comparers[0]);

            for (int i = 1; i < comparers.Length; i++)
            {
                OrderedThis = OrderedThis.ThenBy(m => m, comparers[i]);
            }

            List <T> lstOrderedThis = new List <T>(OrderedThis.Cast <T>());

            for (int i = 0; i < lstOrderedThis.Count; i++)
            {
                var oldIndex = IndexOf(lstOrderedThis[i]);
                var newIndex = i;
                if (oldIndex != newIndex)
                {   // Это условие необходимо, чтобы избежать вот этой ошибки:
                    // https://stackoverflow.com/questions/42204898/why-is-the-combobox-losing-its-selecteditem-when-sorting-the-itemssource/42204899#42204899
                    Move(oldIndex, newIndex);
                }
            }
        }
示例#3
0
        internal static void ReportToXml(IOrderedEnumerable <ReportData> reportResult)
        {
            List <ReportData> y = reportResult.Cast <ReportData>().ToList();

            DataContractSerializer s = new DataContractSerializer(typeof(List <ReportData>));

            using (FileStream fs = File.Open("myTest" + typeof(List <ReportData>).Name + ".xml", FileMode.Create))
            {
                Console.WriteLine("Testing for type: {0}", typeof(List <ReportData>));
                s.WriteObject(fs, y);
            }
        }
示例#4
0
            void OnSortingChanged(MultiColumnHeader multiColumnHeader)
            {
                if (multiColumnHeader.sortedColumnIndex == -1)
                {
                    return; // No column to sort for (just use the order the data are in)
                }

                // Sort the roots of the existing tree items
                var sortedColumns = multiColumnHeader.state.sortedColumns;

                if (sortedColumns.Length == 0)
                {
                    return;
                }

                var sortOption = sortedColumns[0];

                IOrderedEnumerable <LuaMemoryTreeViewItem> sortedData = null;

                switch (sortOption)
                {
                case 0:
                    sortedData = m_Data.OrderBy(l => l.displayName);
                    break;

                case 1:
                    sortedData = m_Data.OrderBy(l => l.count);
                    break;

                case 2:
                    sortedData = m_Data.OrderBy(l => l.memory);
                    break;

                case 3:
                    sortedData = m_Data.OrderBy(l => l.avgMemory);
                    break;
                }

                m_Root.children = sortedData.Cast <TreeViewItem>().ToList();
                Reload();
            }
示例#5
0
        private void SortByMultipleColumns()
        {
            int[] sortedColumns = this.multiColumnHeader.state.sortedColumns;
            if (sortedColumns.Empty())
            {
                return;
            }

            IEnumerable <TreeViewItem <TreeElementType> >        types        = this.rootItem.children.Cast <TreeViewItem <TreeElementType> >();
            IOrderedEnumerable <TreeViewItem <TreeElementType> > orderedQuery = this.GetInitialOrder(types, sortedColumns);

            for (int c = 1; c < sortedColumns.Length; ++c)
            {
                int            index     = sortedColumns[c];
                TreeViewColumn column    = this.columns[index];
                bool           ascending = this.multiColumnHeader.IsSortedAscending(index);
                orderedQuery = orderedQuery.ThenBy(l => column.selectorFunction(l), ascending);
            }

            this.rootItem.children = orderedQuery.Cast <TreeViewItem>().ToList();
        }
示例#6
0
        private void SortByMultipleColumns()
        {
            int[] sortedColumns = multiColumnHeader.state.sortedColumns;

            if (sortedColumns.Length == 0)
            {
                return;
            }

            IEnumerable <TreeViewItem <T> >        myTypes      = rootItem.children.Cast <TreeViewItem <T> >();
            IOrderedEnumerable <TreeViewItem <T> > orderedQuery = InitialOrder(myTypes, sortedColumns);

            for (int i = 1; i < sortedColumns.Length; i++)
            {
                TSort sortOption = SortOptions[sortedColumns[i]];
                bool  ascending  = multiColumnHeader.IsSortedAscending(sortedColumns[i]);

                orderedQuery = Sort(sortOption, orderedQuery, ascending);
            }

            rootItem.children = orderedQuery.Cast <TreeViewItem>().ToList();
        }
示例#7
0
        private static bool DownloadEpisodes(Title[] Episodes)
        {
            int CurrEpisode   = 0;
            int TotalEpisodes = Episodes.Length;

            foreach (Title Episode in Episodes)
            {
                CurrEpisode++;
                Logger.Info("Downloading Episode #" + CurrEpisode + "/" + TotalEpisodes + " - " + Episode.ID);
                JObject VideoData = (JObject)Fetch(
                    string.Join("/", new string[] {
                    "http://api.contents.watchabc.go.com/vp2/ws/s/contents/3000/videos",
                    BrandID,    //brand_id
                    "001",
                    "-1",
                    "-1",       //show_id?
                    "-1",
                    Episode.ID, //video_id
                    "-1",
                    "-1.json"
                }),
                    string.Empty,
                    "json"
                    );

                string M3U8Url = null;
                // No DRM, No Adobe Auth, 100% open
                if (Episode.AccessLevel == 0)
                {
                    Logger.Info("S" + Episode.TV_Season_Serial + "E" + Episode.TV_Episode_Serial + " is FREE! Getting it directly via authorize.json");
                    do
                    {
                        try {
                            JToken AuthorizeRes = JObject.Parse(new WebClient {
                                Encoding = Encoding.UTF8,
                                Headers  = { {
                                                 HttpRequestHeader.ContentType,
                                                 "application/x-www-form-urlencoded"
                                             }, {
                                                 HttpRequestHeader.Referer,
                                                 "http://cdn1.edgedatg.com/aws/apps/datg/web-player-unity/1.0.6.13/swf/player_vod.swf"
                                             } }
                            }.UploadString(
                                                                    "https://api.entitlement.watchabc.go.com/vp2/ws-secure/entitlement/2020/authorize.json",
                                                                    string.Join("&", new[] {
                                "device=" + DeviceID,
                                "video%5Ftype=lf",    //?
                                "video%5Fid=" + Episode.ID.Replace("_", "%5F"),
                                "brand=" + BrandID
                            })
                                                                    ));
                            bool error = AuthorizeRes.SelectToken("$.errors.count") != null;
                            M3U8Url = error ? null : VideoData.SelectToken("$.video[0].assets.asset[?(@.storagetype=='uplynk')].value").ToString() + "?" + AuthorizeRes.SelectToken("$.uplynkData.sessionKey").ToString() + "&ad.cping=1";
                            if (error)
                            {
                                Logger.Error("authorize.json call failed :( Attempting with Web Player Device ID Instead...");
                                DeviceID = "001";
                            }
                        } catch {
                            Logger.Error("authorize.json call failed :( Aborting...");
                            return(false);
                        }
                    } while (M3U8Url == null);
                }
                else
                {
                    Logger.Info("S" + Episode.TV_Season_Serial + "E" + Episode.TV_Episode_Serial + " is locked behind Adobe MSO/SP Auth, Getting it via Adobe shortAuthorize and authorize.json");
                    AdobeAuthSP aasp = new AdobeAuthSP {
                        REQUESTERID    = "DisneyChannels",
                        REQUESTINGPAGE = "https://disneynow.go.com" + Episode.URL,
                        RESOURCEID     = string.Concat(new[] {
                            "<rss version=\"2.0\" xmlns:media=\"http://search.yahoo.com/mrss/\"><channel><title>ABC</title><item><title>",
                            Episode.Name,
                            "</title><guid>",
                            Episode.ID,
                            "</guid><media:rating scheme=\"urn:v-chip\" /></item></channel></rss>"
                        })
                    };
                    M3U8Url = Regex.Match(
                        new WebClient {
                        Encoding = Encoding.UTF8,
                        Headers  = { {
                                         HttpRequestHeader.ContentType, "application/x-www-form-urlencoded"
                                     } }
                    }.UploadString(
                            "https://api.entitlement.watchabc.go.com/vp2/ws-secure/entitlement/2020/playmanifest_secure.json",
                            string.Join("&", new[] {
                        "video_type=lf",               //?
                        "video_id=" + Episode.ID,
                        "adobe_requestor_id=DisneyXD", //Should this be "DisneyChannels" like with aasp?
                        "brand=" + BrandID,
                        "token_type=ap",               //ap = adobepass
                        "device=" + DeviceID,
                        "token=" + WebUtility.UrlEncode(aasp.ShortAuthorize())
                    })
                            ),
                        "\"([^\"]+m3u8[^\"]+)"
                        ).Groups[1].Value;
                }
                // Subtitles
                string ttml = (string)VideoData.SelectToken("$.video[0].closedcaption.src[?(@.type=='ttml')].value");
                if (ttml != string.Empty)
                {
                    DownloadSRT(ttml);
                }
                // Chapters
                if (VideoData.SelectTokens("$.video[0].cues.cue[*].value").Count() > 0)
                {
                    Logger.Debug("Generating Chapters (based on json cues)");
                    File.WriteAllText(
                        "temp/.chapters",
                        string.Join("\n",
                                    VideoData.SelectTokens("$.video[0].cues.cue[*].value").Select((x, i) => {
                        int num       = i + 1;
                        string numPad = num.ToString().PadLeft(2, '0');
                        return(string.Join("\n", new[] {
                            "CHAPTER" + numPad + "=" + TimeSpan.FromMilliseconds((double)x).ToString("hh\\:mm\\:ss\\.fff"),
                            "CHAPTER" + numPad + "NAME=Chapter " + num
                        }));
                    })
                                    )
                        );
                }
                // Download M3U8 File Contents and Get Resolutions
                string m3u8res = (string)Fetch(M3U8Url);
                IOrderedEnumerable <Match> resolutions = Regex.Matches(m3u8res, "#EXT-X-STREAM.*?RESOLUTION=[^x]*x([^,]*),BANDWIDTH=([^,]*).*\\s(.*)").Cast <Match>().OrderByDescending(f => int.Parse(f.Groups[2].Value)).OrderByDescending(f => int.Parse(f.Groups[1].Value));
                string Choice           = string.Empty;
                bool   CLIChoiceInvalid = Arguments.Quality != null && Arguments.Quality != "best" && !resolutions.Cast <Match>().Any(x => x.Groups[1].Value == Arguments.Quality);
                if (Arguments.Quality == null || CLIChoiceInvalid)
                {
                    if (CLIChoiceInvalid)
                    {
                        Logger.Error("--quality value \"" + Arguments.Quality + "\" is not valid for " + Episode.URL + "\n Please choose a new one below.");
                    }
                    VideoTracks(resolutions.Cast <Match>().Select((res, i) => res.Groups.Cast <Group>().Skip(1).Take(2).Select(x => x.Value).ToArray()).ToArray());
                    Choice = AskInput("Which resolution do you wish to download? (use # or 'best')").Trim('#');
                }
                else
                {
                    Choice = Arguments.Quality;
                }
                Match selected = Choice == "best" ? resolutions.First() : resolutions.ElementAt(int.Parse(Choice) - 1);
                Logger.Info("VIDEO: " + selected.Groups[1].Value + "p @ " + selected.Groups[2].Value + " bandwidth");
                string OutputFileName = Episode.Name_Serial + ".S" + Episode.TV_Season_Serial + "E" + Episode.TV_Episode_Serial + "." + Episode.TV_EpisodeTitle_Serial + ".[QUALITY]p.WEB.[CODEC]";
                DownloadM3U8withMultiThreading(
                    selected.Groups[3].Value,
                    OutputFileName
                    );
                Console.WriteLine("Done!");
            }
            return(true);
        }
示例#8
0
        public void DownloadEpisode(string URL)
        {
            string PageContent    = new WebClient().DownloadString(URL);
            string MediaID        = null;
            bool   MediaProtected = false;

            foreach (string video in Regex.Matches(PageContent, "\"Video:[^\"]*\":{([^}]*}[^}]*)}").Cast <Match>().Select(m => m.Groups[1].Value))
            {
                if (!video.Contains("\"slug\":\"" + URL.Substring(URL.LastIndexOf('/') + 1) + "\""))
                {
                    continue;
                }
                MediaProtected = !video.Contains("\"auth\":false,");
                if (!MediaProtected)
                {
                    MediaID = Regex.Match(video, "\"_id\":\"([^\"]*)").Groups[1].Value;
                }
                else
                {
                    MediaID = Regex.Match(video, "\"mediaID\":\"([^\"]*)").Groups[1].Value;
                }
                break;
            }
            if (MediaID == null)
            {
                Logger.Error("No MediaID obtained, aborting");
                return;
            }
            if (MediaProtected)
            {
                Logger.Info(URL + " is locked behind Adobe MSO/SP Auth, Getting it via Adobe shortAuthorize and authorize.json");

                // Get M3U8 URL
                AdobeAuthSP aasp = new AdobeAuthSP {
                    REQUESTERID    = "AdultSwim",
                    REQUESTINGPAGE = URL,
                    RESOURCEID     = "AdultSwim" //shouldnt this have some content data like disney and such? works but ehh
                };
                string    NGTVRes    = new WebClient().DownloadString("http://medium.ngtv.io/media/" + MediaID + "/tv");
                string    bulkAesURL = Regex.Match(NGTVRes, "bulkaes\":{.*?\"url\":\"([^\"]*)").Groups[1].Value;
                WebClient wc         = new WebClient();
                wc.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36");
                wc.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");
                ServicePointManager.Expect100Continue = false;
                string M3U8Url = bulkAesURL + "?hdnea=" + Regex.Match(
                    wc.UploadString(
                        "http://token.vgtf.net/token/token_spe",
                        string.Join("&", new[] {
                    "path=" + WebUtility.UrlEncode(Regex.Match(bulkAesURL, "https?://[^/]+(.+)$").Groups[1].Value),
                    "videoId=" + MediaID,
                    "profile=tve",           //?
                    "accessTokenType=Adobe", //Adobe Auth
                    "accessToken=" + WebUtility.UrlEncode(aasp.ShortAuthorize())
                })
                        ),
                    "<token>(.*)?<\\/token>"
                    ).Groups[1].Value;

                // Chapters
                string bulkAesData = JToken.Parse(NGTVRes)["media"]["tv"]["bulkaes"].ToString();
                if (bulkAesData.Contains("\"start\""))
                {
                    Logger.Debug("Generating Chapters (based on json bulkaes data)");
                    PrepareDirectory(new[] { "temp" });
                    File.WriteAllText(
                        "temp/.chapters",
                        string.Join("\n",
                                    Regex.Matches(bulkAesData, "\"start\":([^,]*)").Cast <Match>().Select((x, i) => {
                        int num       = i + 1;
                        string numPad = num.ToString().PadLeft(2, '0');
                        return(string.Join("\n", new[] {
                            "CHAPTER" + numPad + "=" + TimeSpan.FromSeconds(double.Parse(x.Groups[1].Value)).ToString("hh\\:mm\\:ss\\.fff"),
                            "CHAPTER" + numPad + "NAME=Chapter " + num
                        }));
                    })
                                    )
                        );
                }

                // Download M3U8 File Contents and Get Resolutions
                string M3U8Content = new WebClient().DownloadString(M3U8Url);
                IOrderedEnumerable <Match> resolutions = Regex.Matches(M3U8Content, "#EXT-X-STREAM.*?BANDWIDTH=([^,]*),RESOLUTION=[^x]*x([^,]*).*\\s(.*)").Cast <Match>().OrderByDescending(f => int.Parse(f.Groups[1].Value)).OrderByDescending(f => int.Parse(f.Groups[2].Value));
                string Choice           = string.Empty;
                bool   CLIChoiceInvalid = Arguments.Quality != null && Arguments.Quality != "best" && !resolutions.Cast <Match>().Any(x => x.Groups[2].Value == Arguments.Quality);
                if (Arguments.Quality == null || CLIChoiceInvalid)
                {
                    if (CLIChoiceInvalid)
                    {
                        Logger.Error("--quality value \"" + Arguments.Quality + "\" is not valid for " + URL + "\n Please choose a new one below.");
                    }
                    VideoTracks(resolutions.Cast <Match>().Select((res, i) => res.Groups.Cast <Group>().Skip(1).Take(2).Select(x => x.Value).ToArray()).ToArray());
                    Choice = AskInput("Which resolution do you wish to download? (use # or 'best')").Trim('#');
                }
                else
                {
                    Choice = Arguments.Quality;
                }
                Match selected = Choice == "best" ? resolutions.First() : resolutions.ElementAt(int.Parse(Choice) - 1);
                Logger.Info("VIDEO: " + selected.Groups[2].Value + "p @ " + selected.Groups[1].Value + " bandwidth");

                string OutputFileName = "out";// Episode.Name_Serial + ".S" + Episode.TV_Season_Serial + "E" + Episode.TV_Episode_Serial + "." + Episode.TV_EpisodeTitle_Serial + "." + selected.Groups[1].Value + "p.WEB.[CODEC]";
                DownloadM3U8withMultiThreading(
                    bulkAesURL.Substring(0, bulkAesURL.LastIndexOf("/") + 1) + selected.Groups[3].Value,
                    OutputFileName
                    );

                // SHOULDNT NEED:

                //string text7 = new WebClient().DownloadString(chosenResM3u8Url);
                //File.WriteAllText("thing.m3u8", text7);
                //string text8 = Regex.Match(chosenResM3u8Url, "(http.*/)").Groups[1].Value + "seg.key";
                //string text9 = Regex.Match(text7, "(#EXT-X-KEY:METHOD=AES-128.*)").Groups[1].Value.Replace("seg.key", text8);
                //List<string> list3 = new List<string>();
                //int num2 = 0;
                //foreach (Match match3 in Regex.Matches(text7, "(#EXTINF[^,]+,.*?)#EXT-X-(DISCONTINUITY|ENDLIST)", RegexOptions.Singleline)) {
                //    string text11 = "output_seg" + num2.ToString();
                //    list3.Add(text11);
                //    using (StreamWriter streamWriter2 = new StreamWriter(text11 + ".m3u8")) {
                //        streamWriter2.Write("#EXTM3U\n#EXT-X-TARGETDURATION:6\n#EXT-X-VERSION:4\n#EXT-X-MEDIA-SEQUENCE:0\n#EXT-X-PLAYLIST-TYPE:VOD\n" + text9 + "\n" + Regex.Replace(match3.Groups[1].Value, "^([^#].*)$", Regex.Match(chosenResM3u8Url, "(http.*/)").Groups[1].Value + "$1", RegexOptions.Multiline) + Environment.NewLine + "#EXT-X-ENDLIST");
                //        streamWriter2.Flush();
                //    }
                //    num2++;
                //}
                //foreach (string text12 in list3) {
                //    if (RunEXE("ffmpeg.exe", "-protocol_whitelist file,http,https,tcp,tls,crypto -y -hide_banner -i \"" + text12 + ".m3u8\" -c copy \"output_seg" + list3.IndexOf(text12).ToString() + ".ts\"") != 0) {
                //        Console.WriteLine("[!ERROR]: ffmpeg closed with an error code :(");
                //    }
                //    RunEXE("ccextractor/ccextractorwin.exe", "--no_progress_bar \"output_seg" + list3.IndexOf(text12).ToString() + ".ts\"");
                //}

                //string text13 = "--output \"output.mkv\" ";
                //foreach (string str2 in list3) {
                //    text13 += "\"" + str2 + ".ts\" + ";
                //}
                //text13 = text13.Trim(new[] { ' ', '+' });
                //foreach (string text14 in list3) {
                //    if (File.Exists(text14 + ".srt")) {
                //        text13 += " --default-track 0:false --sub-charset 0:UTF-8 \"" + text14 + ".srt\" + ";
                //    } else {
                //        Console.WriteLine("[!ERROR]: Subtitle segment " + list3.IndexOf(text14).ToString() + " missing. Subtitles might be out of sync.");
                //    }
                //}
                //text13 = text13.Trim(new[] { ' ', '+' });
                //if (File.Exists("output_chapters.txt")) {
                //    text13 = text13 + " --chapters \"output_chapters.txt\"";
                //}
                //Console.WriteLine("Muxing...");
                //if (RunEXE("mkvmerge/mkvmerge.exe", text13) != 0) {
                //    Console.WriteLine("MKVMerge exited with error.");
                //    return false;
                //}
                //foreach (string str3 in list3) {
                //    File.Delete(str3 + ".ts");
                //    File.Delete(str3 + ".srt");
                //    File.Delete(str3 + ".m3u8");
                //}
                //File.Delete("output_chapters.txt");
            }
            else
            {
                Logger.Info(URL + " is FREE! Downloading directly via apiv1");

                JToken APIRes  = JToken.Parse(new WebClient().DownloadString("https://www.adultswim.com/api/shows/v1/videos/" + MediaID + "?fields=title%2Ccollection_title%2Cstream%2Csegments"))["data"]["video"];
                string PageRes = new WebClient().DownloadString(APIRes["url"].ToString());

                string chaptersdata = new WebClient().DownloadString(APIRes["stream"]["assets"].Where(asset => asset["url"].ToString().Contains("cue_points")).First()["url"].ToString());

                // Subtitles
                string vtt = APIRes["stream"]["assets"].Where(asset => asset["mime_type"].ToString() == "text/vtt").First()["url"].ToString();
                if (vtt != string.Empty)
                {
                    DownloadSRT(vtt);
                }

                // Chapters
                if (chaptersdata.Contains("<start time=\""))
                {
                    Logger.Debug("Generating Chapters (based on xml adcue data)");
                    PrepareDirectory(new[] { "temp" });
                    File.WriteAllText(
                        "temp/.chapters",
                        string.Join("\n",
                                    Regex.Matches(chaptersdata, "start time=\"([^:]*):([^:]*):([^:]*):([^\"]*)").Cast <Match>().Select((x, i) => {
                        int num       = i + 1;
                        string numPad = num.ToString().PadLeft(2, '0');
                        return(string.Join("\n", new[] {
                            "CHAPTER" + numPad + "=" + x.Groups[1].Value + ":" + x.Groups[2].Value + ":" + x.Groups[2].Value + "." + x.Groups[2].Value + "0",
                            "CHAPTER" + numPad + "NAME=Chapter " + num
                        }));
                    })
                                    )
                        );
                }

                string Title         = Regex.Replace(APIRes["collection_title"].ToString(), "[/\\*!?,.\'\"()<>:|]", string.Empty).Replace(" ", ".");
                string EpisodeName   = Regex.Replace(APIRes["title"].ToString(), "[/\\*!?,.\'\"()<>:|]", string.Empty).Replace(" ", ".");
                string SeasonNumber  = "0";
                Match  EpisodeFind   = Regex.Match(PageRes, "EP[^<]*?<!-- -->([^<]*)<!-- -->[^<]*?<\\/span><span>" + APIRes["title"].ToString() + "<\\/span>");
                string EpisodeNumber = EpisodeFind.Groups[1].Value;

                int[] Seasons = Regex.Matches(PageRes, "Season ([^<]*)<\\/h3>").Cast <Match>().Select(x => int.Parse(x.Groups[1].Value)).ToArray();
                for (int i = 0; i < Seasons.Length; i++)
                {
                    int Season           = Seasons[i];
                    int EpisodeTextIndex = PageRes.IndexOf(EpisodeFind.Value);
                    // If the Episode text is after the current season text
                    if (EpisodeTextIndex > PageRes.IndexOf("Season " + Season + "<\\/h3>"))
                    {
                        // and If its the last season number found, then it must be the one.
                        // or
                        // and if the episode is before the next season number it must be the one.
                        if (i == Seasons.Length - 1 || EpisodeTextIndex < PageRes.IndexOf("Season " + Seasons[i + 1] + "<\\/h3>"))
                        {
                            SeasonNumber = Season.ToString();
                        }
                    }
                }

                string OutputFilename = Title + ".S" + SeasonNumber.ToString().PadLeft(2, '0') + "E" + EpisodeNumber.PadLeft(2, '0') + "." + EpisodeName + ".[QUALITY]p.WEB.[CODEC]";
                Logger.Debug(OutputFilename);

                DownloadM3U8withMultiThreading(
                    ChooseResolutionFromM3U8(
                        Regex.Match(new WebClient().DownloadString("https://www.adultswim.com/api/shows/v1/media/" + MediaID + "/desktop"), "url\":\"([^\"]*)").Groups[1].Value
                        ),
                    OutputFilename
                    );
            }
        }