public override ISource Create(Uri uri, string pageData)
        {
            Match m = PathAndQueryRegex.Match(uri.PathAndQuery);
            int id = int.Parse(m.Groups["id"].Value);

            string showIcon = pageData.GetStringBetween("<div id=\"ShowIcon\">", " src=\"", "\"");
            string showTitle = pageData.GetStringBetween("<div id=\"ShowTitle\">", ">", "<");

            int index = 0;
            string showInfoLinks = pageData.GetStringBetween("<div id=\"ShowInfoLinks\">", "</div>");
            string showHref = showInfoLinks.GetStringBetween(ref index, "href=\"", "\"");
            string showArchiveHref = showInfoLinks.GetStringBetween(ref index, "href=\"", "\"");

            string title = pageData.GetStringBetween("player.setPostsTitle(\"", "\"");
            string description = pageData.GetStringBetween("<meta name=\"description\" content=\"", "\"");
            string thumbnail = pageData.GetStringBetween("<link rel=\"videothumbnail\" href=\"", "\"");

            ParameterList parameters = new ParameterList();
            parameters.AddValue(VideoDownloadSourceCreator.IdParameterName, id.ToString());
            parameters.AddValue(VideoDownloadSourceCreator.TitleParameterName, title);
            parameters.AddValue(VideoDownloadSourceCreator.DescriptionParameterName, description);
            parameters.AddValue(VideoDownloadSourceCreator.ThumbnailParameterName, thumbnail);
            parameters.AddValue(ShowParameterName, showTitle);
            parameters.AddValue(ShowHrefParameterName, showHref);
            parameters.AddValue(ShowArchiveHrefParameterName, showArchiveHref);
            parameters.AddValue(ShowThumbnailParameterName, showIcon);

            VideoDownloadSource downloadSource = new VideoDownloadSource(uri, this, parameters);

            string formatOptionStart = String.Format("<option value=\"/file/{0}?filename=", id);
            int currentPosition = 0;

            while (true)
            {
                string fileName = pageData.GetStringBetween(ref currentPosition, formatOptionStart, "\"");
                if (string.IsNullOrEmpty(fileName))
                    break;
                currentPosition += fileName.Length;
                string formatName = pageData.GetStringBetween(ref currentPosition, ">", "</option>");
                currentPosition += formatName.Length;
                formatName = formatName.HtmlDecode();
                Uri fileUri = new Uri(String.Format("http://blip.tv/file/get/{0}", fileName));

                ParameterList specParameters = new ParameterList();
                specParameters.AddValue(BlipVideoDownloadSpecifier.FormatNameParameterName, formatName);

                DownloadSpecifier ds = new BlipVideoDownloadSpecifier(fileUri, downloadSource, specParameters);
                downloadSource.Add(ds);
            }

            return downloadSource;
        }
        public override ISource Create(Uri uri, string pageData)
        {
            string userHref = pageData.GetStringBetween("<link rel=\"canonical\"", " href=\"", "\"");
            string username = userHref.GetStringBetween("/user/", null);

            string title = pageData.GetStringBetween("<meta name=\"title\" content=\"", "\"");
            string description = pageData.GetStringBetween("<meta name=\"description\" content=\"", "\"");
            string thumbnail = pageData.GetStringBetween("<meta property=\"og:image\" content=\"", "\"");

            // thumbnail format changed (no http/s)
            // //i1.ytimg.com/i/dbL-i29FDPYok8X8yIynNQ/1.jpg?v=9aee31

            string ajaxSessionInfo = pageData.GetStringBetween("window.ajax_session_info", "'", "'");

            var parameters = new ParameterList();
            parameters.AddValue(UserParameterName, username);
            parameters.AddValue(UserHrefParameterName, userHref);
            parameters.AddValue(TitleParameterName, title);
            parameters.AddValue(DescriptionParameterName, description);
            parameters.AddValue(ThumbnailParameterName, thumbnail);
            parameters.AddValue(AjaxSessionInfoParameterName, ajaxSessionInfo);

            var channelSource = new YoutubeVideoChannelSource(uri, this, parameters);

            var downloadSources = ParseDownloadSources(pageData, channelSource);
            foreach (var downloadSource in downloadSources)
                channelSource.Add(downloadSource);

            return channelSource;
        }
        public override ISource Create(Uri uri, string pageData)
        {
            string userHref = uri.Host;
            string username = userHref.Split('.')[0];

            string title = pageData.GetStringBetween("<title>", "</title>").Trim();
            string currentPageStr = pageData.GetStringBetween("<span id=\"pagination_current_page\"", ">", "<");
            string totalPagesStr = pageData.GetStringBetween("<span id=\"pagination_total_pages\"", ">", "<");

            string pagingUrl = pageData.GetStringBetween("<div class=\"view_pages_page\"", " href=\"", "\"");
            string pagingUrlFormat = Regex.Replace(pagingUrl, @"page=\d+", "page={0}");

            ParameterList parameters = new ParameterList();
            parameters.AddValue(VideoChannelSourceCreator.UserParameterName, username);
            parameters.AddValue(VideoChannelSourceCreator.UserHrefParameterName, userHref);
            parameters.AddValue(VideoChannelSourceCreator.TitleParameterName, title);
            parameters.AddValue(CurrentPageParameterName, int.Parse(currentPageStr));
            parameters.AddValue(TotalPagesParameterName, int.Parse(totalPagesStr));
            parameters.AddValue(PagingUrlFormatParameterName, pagingUrlFormat);

            BlipVideoChannelSource channelSource = new BlipVideoChannelSource(uri, this, parameters);

            var downloadSources = ParseDownloadSources(pageData, channelSource);
            foreach (var downloadSource in downloadSources)
                channelSource.Add(downloadSource);

            return channelSource;
        }
        private IEnumerable<IDownloadSource> ParseDownloadSources(string pageData, YoutubeVideoChannelSource channelSource)
        {
            var sources = new List<IDownloadSource>();
            DownloadSourceCreator downloadSourceCreator = null;

            int currentPosition = 0;

            while (true)
            {
                string videoId = pageData.GetStringBetween(ref currentPosition, "\"encryptedVideoId\">", "<");
                if (string.IsNullOrEmpty(videoId))
                    break;
                videoId = videoId.Trim();

                string videoUri = pageData.GetStringBetween(ref currentPosition, "<div class=\"playnav-video-thumb\"", " href=\"", "\"");
                string videoThumb = pageData.GetStringBetween(ref currentPosition, " src=\"", "\"");
                string videoTitle = pageData.GetStringBetween(ref currentPosition, "title=\"", "\"").HtmlDecode();
                string videoTime = pageData.GetStringBetween(ref currentPosition, "<span class=\"video-time\">", "<");
                string videoViews = pageData.GetStringBetween(ref currentPosition, "<div class=\"metadata\">", ">", " views");

                videoThumb = new Uri(channelSource.Uri, videoThumb).AbsoluteUri;
                int parsedViews = int.Parse(videoViews, System.Globalization.NumberStyles.AllowThousands);
                var absoluteUri = new Uri(channelSource.Uri, videoUri);

                if (downloadSourceCreator == null)
                    downloadSourceCreator = (DownloadSourceCreator)Factory.Context.FindFactoryByCreatorType(typeof(DownloadSourceCreator)).GetCreator(absoluteUri);

                var videoParameters = new ParameterList();
                videoParameters.AddValue(VideoDownloadSourceCreator.IdParameterName, videoId);
                videoParameters.AddValue(VideoDownloadSourceCreator.TitleParameterName, videoTitle);
                videoParameters.AddValue(VideoDownloadSourceCreator.DescriptionParameterName, channelSource.Description);
                videoParameters.AddValue(VideoDownloadSourceCreator.ThumbnailParameterName, videoThumb);
                videoParameters.AddValue(YoutubeVideoDownloadSourceCreator.UserParameterName, channelSource.User);
                videoParameters.AddValue(YoutubeVideoDownloadSourceCreator.UserHrefParameterName, channelSource.UserHref);
                videoParameters.AddValue(YoutubeVideoDownloadSourceCreator.TimeParameterName, videoTime);
                videoParameters.AddValue(YoutubeVideoDownloadSourceCreator.ViewCountParameterName, parsedViews);

                var ds = new YoutubeVideoDownloadSource(absoluteUri, downloadSourceCreator, videoParameters);
                sources.Add(ds);
            }
            return sources;
        }
        private IEnumerable<IDownloadSource> ParseDownloadSources(string pageData, VideoChannelSource channelSource)
        {
            List<IDownloadSource> downloadSources = new List<IDownloadSource>();
            DownloadSourceCreator downloadSourceCreator = null;

            string videoStart = "<div class=\"ArchiveEpisodeWrapper\">";
            int currentPosition = 0;

            while (true)
            {
                string testStart = pageData.GetStringBetween(ref currentPosition, videoStart, null);
                if (String.IsNullOrEmpty(testStart))
                    break;

                string videoUri = pageData.GetStringBetween(ref currentPosition, "<a href=\"", "\"");
                string videoThumb = pageData.GetStringBetween(ref currentPosition, " src=\"", "\"");
                string videoTitle = pageData.GetStringBetween(ref currentPosition, " alt=\"", "\"");

                string videoId = videoUri.GetStringBetween("/file/", "/");

                Uri absoluteUri = new Uri(channelSource.Uri, videoUri);

                if (downloadSourceCreator == null)
                    downloadSourceCreator = (DownloadSourceCreator)Factory.Context.FindFactoryByCreatorType(typeof(DownloadSourceCreator)).GetCreator(absoluteUri);

                ParameterList videoParameters = new ParameterList();
                videoParameters.AddValue(VideoDownloadSourceCreator.IdParameterName, videoId);
                videoParameters.AddValue(VideoDownloadSourceCreator.TitleParameterName, videoTitle);
                videoParameters.AddValue(VideoDownloadSourceCreator.ThumbnailParameterName, videoThumb);

                VideoDownloadSource ds = new VideoDownloadSource(absoluteUri, downloadSourceCreator, videoParameters);
                downloadSources.Add(ds);
            }
            return downloadSources;
        }
        public override ISource Create(Uri uri, string pageData)
        {
            string title = pageData.GetStringBetween("<meta name=\"title\" content=\"", "\"");
            string description = pageData.GetStringBetween("<meta name=\"description\" content=\"", "\"");
            string thumbnail = pageData.GetStringBetween("<meta property=\"og:image\" content=\"", "\"");

            string viewsRegion = pageData.GetStringBetween("<span class=\"watch-view-count\"", ">", "</span>");
            string views = viewsRegion.GetStringBetween("<strong>", "</strong>");
            int viewCount = int.Parse(views, System.Globalization.NumberStyles.AllowThousands);

            string userRegion = pageData.GetStringBetween("<a class=\"watch-description-username\"", "</a>");
            string userHref = userRegion.GetStringBetween("href=\"", "\"");
            string user = userRegion.GetStringBetween("<strong>", "</strong>");

            string dateRegion = pageData.GetStringBetween("<span id=\"eow-date-short\"", ">", "</span>").Trim();
            DateTime date = DateTime.Parse(dateRegion);

            string flashVarsValue = pageData.GetStringBetween("<param name=\\\"flashvars\\\" value=\\\"", "\\\"");
            string[] flashVarsSplit = flashVarsValue.Split('&');
            SortedList<string, string> flashVars = new SortedList<string, string>(flashVarsSplit.Length);
            foreach (string chunk in flashVarsSplit)
            {
                string[] chunkSplit = chunk.Split('=');
                flashVars.Add(chunkSplit[0], Uri.UnescapeDataString(chunkSplit[1]));
            }

            string fmt_map = flashVars["fmt_map"];
            string[] fmtSplit = fmt_map.Split(',');
            Dictionary<int, int[]> qualityLevels = new Dictionary<int, int[]>();
            foreach (string chunk in fmtSplit)
            {
                string[] fmt = chunk.Split('/');
                string[] res = fmt[1].Split('x');
                qualityLevels.Add(int.Parse(fmt[0]), new int[] { int.Parse(res[0]), int.Parse(res[1]) });
            }

            string id = flashVars["video_id"];

            ParameterList parameters = new ParameterList();
            parameters.AddValue(VideoDownloadSourceCreator.IdParameterName, id);
            parameters.AddValue(VideoDownloadSourceCreator.TitleParameterName, title);
            parameters.AddValue(VideoDownloadSourceCreator.DescriptionParameterName, description);
            parameters.AddValue(VideoDownloadSourceCreator.ThumbnailParameterName, thumbnail);
            parameters.AddValue(UserParameterName, user);
            parameters.AddValue(UserHrefParameterName, userHref);
            parameters.AddValue(DateParameterName, date);
            parameters.AddValue(ViewCountParameterName, viewCount);

            VideoDownloadSource downloadSource = new YoutubeVideoDownloadSource(uri, this, parameters);

            string fmt_url_map = flashVars["fmt_url_map"];
            string[] urlSplit = fmt_url_map.Split(',');
            foreach (string chunk in urlSplit)
            {
                string[] fmt_url = chunk.Split('|');
                Uri fmt_uri = new Uri(fmt_url[1]);
                int qualityLevel = int.Parse(fmt_url[0]);
                int[] res = qualityLevels[qualityLevel];
                string resolution = String.Format("{0}x{1}", res[0], res[1]);

                ParameterList specParameters = new ParameterList();
                specParameters.AddValue(YoutubeVideoDownloadSpecifier.FmtParameterName, qualityLevel);
                specParameters.AddValue(YoutubeVideoDownloadSpecifier.ResolutionParameterName, resolution);
                specParameters.AddValue(YoutubeVideoDownloadSpecifier.MaxPixelHeightParameterName, res[1]);

                DownloadSpecifier ds = new YoutubeVideoDownloadSpecifier(fmt_uri, downloadSource, specParameters);
                downloadSource.Add(ds);
            }

            return downloadSource;
        }