Inheritance: Response
        public async Task<Updates> Updates(ISession session)
        {
            try
            {
                if (!UpdateHistory.IsLoaded)
                    UpdateHistory.Load();
                CrunchySession s = session as CrunchySession;
                if (s == null)
                    return new Updates {ErrorMessage = "Invalid Session", Status = ResponseStatus.InvalidArgument};

                Task<UpdateResponse> c1 = Updates(s, ShowType.Anime);
                Task<UpdateResponse> c2 = Updates(s, ShowType.Drama);
                Task<UpdateResponse> c3 = Updates(s, ShowType.Pop);
                await Task.WhenAll(c1, c2, c3);
                c3.Result.PropagateError(c2.Result);
                c2.Result.PropagateError(c1.Result);
                if (c1.Result.Status != ResponseStatus.Ok)
                {
                    Updates k = new Updates();
                    c1.Result.PropagateError(k);
                    return k;
                }
                c1.Result.Found = c1.Result.Found.Concat(c2.Result.Found).Concat(c3.Result.Found).ToList();
                Episode[] nfnd =
                    c1.Result.NotFound.Concat(c2.Result.NotFound).Concat(c3.Result.NotFound).ToArray();
                Array.Reverse(nfnd);
                c1.Result.NotFound = nfnd.ToList();
                string datetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
                List<Task<Episode>> ms = new List<Task<Episode>>();
                foreach (Episode m in c1.Result.NotFound)
                {
                    ms.Add(GetEpisodeUpdate(s, m, datetime));
                }
                if (ms.Count > 0)
                {
                    while (ms.Count > 0)
                    {
                        int max = 5;
                        if (ms.Count < 5)
                            max = ms.Count;
                        Task<Episode>[] tsks = new Task<Episode>[max];
                        for (int x = 0; x < max; x++)
                        {
                            tsks[x] = ms[0];
                            ms.Remove(ms[0]);
                        }
                        await Task.WhenAll(tsks);
                        for (int x = max - 1; x >= 0; x--)
                        {
                            if (tsks[x].Result != null)
                            {
                                c1.Result.Found.Add(tsks[x].Result);
                            }
                        }
                    }
                    UpdateHistory.Save();
                }
                Updates n = new Updates();
                n.Items = c1.Result.Found.ToList();
                int cnt = 1;
                foreach (Episode epu in n.Items)
                    epu.Index = cnt++;
                n.Status = ResponseStatus.Ok;
                n.ErrorMessage = "OK";
                return n;
            }
            catch (Exception e)
            {
                return new Updates {ErrorMessage = e.ToString(), Status = ResponseStatus.SystemError};
            }
           
        }
        public async Task<Updates> Updates(ISession session)
        {
            try
            {

                Updates upds=new Updates();
                upds.Items=new List<Episode>();
                if (!UpdateHistory.IsLoaded)
                    UpdateHistory.Load();
                DaiSukiSession s = session as DaiSukiSession;
                if (s == null)
                    return new Updates { ErrorMessage = "Invalid Session", Status = ResponseStatus.InvalidArgument };
                Shows sws = await Shows(s, false);
                if (sws.Status != ResponseStatus.Ok)
                {
                    Updates k = new Updates();
                    sws.PropagateError(k);
                    return k;
                }
                int cnt = Convert.ToInt32(GetAuthSetting(DaiSukiPluginInfo.MaxFollowItems));
                List<Show> avs = sws.Items.Take(cnt).ToList();
                List<Task<Episodes>> ms = new List<Task<Episodes>>();
                foreach (Show sh in avs)
                {
                    ms.Add(Episodes(s, sh));
                }
                string datetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
                if (ms.Count > 0)
                {
                    while (ms.Count > 0)
                    {
                        int max = 5;
                        if (ms.Count < 5)
                            max = ms.Count;
                        Task<Episodes>[] tsks = new Task<Episodes>[max];
                        for (int x = 0; x < max; x++)
                        {
                            tsks[x] = ms[0];
                            ms.Remove(ms[0]);
                        }
                        await Task.WhenAll(tsks);
                        for (int x = max - 1; x >= 0; x--)
                        {
                            if (tsks[x].Result != null)
                            {
                                if (tsks[x].Result.Items.Count > 0)
                                {
                                    Episode ep = tsks[x].Result.Items.OrderByDescending(a => a.Index).First();
                                    ep.UniqueTag = DaiSukiPluginInfo.PluginName + "|" + ep.ShowName + "|" +
                                                   ep.EpisodeAlpha;
                                    if (UpdateHistory.Exists(ep.UniqueTag))
                                    {
                                        Episode c =
                                            JsonConvert.DeserializeObject<Episode>(UpdateHistory.Get(ep.UniqueTag));
                                        upds.Items.Add(c);
                                    }
                                    else
                                    {
                                        ep.DateTime = datetime;
                                        UpdateHistory.Add(ep.UniqueTag, JsonConvert.SerializeObject(ep));
                                        upds.Items.Add(ep);
                                    }
                                }
                            }
                        }
                    }
                    UpdateHistory.Save();
                }
                return upds;
            }
            catch (Exception e)
            {
                return new Updates { ErrorMessage = e.ToString(), Status = ResponseStatus.SystemError };
            }
        }