public MediaContainer Search(IProvider prov, string UserId, string limit, string query, bool searchTag, bool nocast = false)
        {
            BreadCrumbs info = prov.UseBreadCrumbs
                ? new BreadCrumbs
                {
                    Key = prov.ConstructSearchUrl(UserId, limit, query, searchTag),
                    Title = "Search for '" + query + "'"
                }
                : null;

            BaseObject ret =
                new BaseObject(prov.NewMediaContainer(MediaContainerTypes.Show, "Search for '" + query + "'", true, true,
                    info));

            int lim;
            if (!int.TryParse(limit, out lim))
                lim = 100;
            JMMUser user = Helper.GetUser(UserId);
            if (user == null) return new MediaContainer() { ErrorString = "User Not Found" };
            List<Video> ls = new List<Video>();
            int cnt = 0;
            IEnumerable<AnimeSeries> series = searchTag
                ? RepoFactory.AnimeSeries.GetAll()
                    .Where(
                        a =>
                            a.Contract != null && a.Contract.AniDBAnime != null &&
                            a.Contract.AniDBAnime.AniDBAnime != null &&
                            (a.Contract.AniDBAnime.AniDBAnime.AllTags.Contains(query,
                                StringComparer.InvariantCultureIgnoreCase) ||
                            a.Contract.AniDBAnime.CustomTags.Select(b => b.TagName)
                                .Contains(query, StringComparer.InvariantCultureIgnoreCase)))
                : RepoFactory.AnimeSeries.GetAll()
                    .Where(
                        a =>
                            a.Contract != null && a.Contract.AniDBAnime != null &&
                            a.Contract.AniDBAnime.AniDBAnime != null &&
                            string.Join(",", a.Contract.AniDBAnime.AniDBAnime.AllTitles).IndexOf(query, 0, StringComparison.InvariantCultureIgnoreCase) >= 0);

            //List<AniDB_Anime> animes = searchTag ? RepoFactory.AniDB_Anime.SearchByTag(query) : RepoFactory.AniDB_Anime.SearchByName(query);
            foreach (AnimeSeries ser in series)
            {
                if (!user.AllowedSeries(ser)) continue;
                Video v = ser.GetPlexContract(user.JMMUserID)?.Clone<Directory>();
                if (v != null)
                {
                    switch (ser.Contract.AniDBAnime.AniDBAnime.AnimeType)
                    {
                        case (int)enAnimeType.Movie:
                            v.SourceTitle = "Anime Movies";
                            break;
                        case (int)enAnimeType.OVA:
                            v.SourceTitle = "Anime Ovas";
                            break;
                        case (int)enAnimeType.Other:
                            v.SourceTitle = "Anime Others";
                            break;
                        case (int)enAnimeType.TVSeries:
                            v.SourceTitle = "Anime Series";
                            break;
                        case (int)enAnimeType.TVSpecial:
                            v.SourceTitle = "Anime Specials";
                            break;
                        case (int)enAnimeType.Web:
                            v.SourceTitle = "Anime Web Clips";
                            break;
                    }
                    if (nocast) v.Roles = null;
                    v.GenerateKey(prov, user.JMMUserID);
                    ls.Add(prov, v, info);
                }
                cnt++;
                if (cnt == lim)
                    break;
            }
            ret.MediaContainer.RandomizeArt(ls);
            ret.MediaContainer.Childrens = Helper.ConvertToDirectory(ls);
            return ret.GetStream(prov);
        }