Example #1
0
        protected async Task <WebClientStringResult> RequestLoginAndFollowRedirect(string url, IEnumerable <KeyValuePair <string, string> > data, string cookies, bool returnCookiesFromFirstCall, string redirectUrlOverride = null, string referer = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url      = url,
                Type     = RequestType.POST,
                Cookies  = cookies,
                Referer  = referer,
                PostData = data
            };
            var response = await webclient.GetString(request);

            var firstCallCookies = response.Cookies;

            if (response.IsRedirect)
            {
                await FollowIfRedirect(response, request.Url, redirectUrlOverride, response.Cookies);
            }

            if (returnCookiesFromFirstCall)
            {
                response.Cookies = firstCallCookies;
            }

            return(response);
        }
Example #2
0
        protected async Task <WebClientStringResult> RequestLoginAndFollowRedirect(string url, IEnumerable <KeyValuePair <string, string> > data, string cookies, bool returnCookiesFromFirstCall, string redirectUrlOverride = null, string referer = null, bool accumulateCookies = false)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url      = url,
                Type     = RequestType.POST,
                Cookies  = cookies,
                Referer  = referer,
                PostData = data,
                Encoding = Encoding
            };
            var response = await webclient.GetString(request);

            CheckTrackerDown(response);
            if (accumulateCookies)
            {
                response.Cookies = ResolveCookies((request.Cookies == null ? "" : request.Cookies + " ") + response.Cookies);
            }
            var firstCallCookies = response.Cookies;

            if (response.IsRedirect)
            {
                await FollowIfRedirect(response, request.Url, redirectUrlOverride, response.Cookies, accumulateCookies);
            }

            if (returnCookiesFromFirstCall)
            {
                response.Cookies = ResolveCookies(firstCallCookies + (accumulateCookies ? " " + response.Cookies : ""));
            }

            return(response);
        }
Example #3
0
        /// <summary>
        /// Get Torrents Page from Tracker by Query Provided
        /// </summary>
        /// <param name="request">URL created by Query Builder</param>
        /// <returns>Results from query</returns>
        private async Task <string> QueryTracker(string request)
        {
            // Cache mode not enabled or cached file didn't exist for our query
            Output("\nQuerying tracker for results....");

            // Build WebRequest for index
            var myIndexRequest = new Utils.Clients.WebRequest()
            {
                Type     = RequestType.GET,
                Url      = request,
                Encoding = Encoding,
                Headers  = EmulatedBrowserHeaders
            };

            // Request our first page
            var results = await webclient.GetString(myIndexRequest);

            if (results.Status == HttpStatusCode.InternalServerError) // See issue #2110
            {
                throw new Exception("Internal Server Error (" + results.Content + "), probably you reached the API limits, please reduce the number of queries");
            }

            // Return results from tracker
            return(results.Content);
        }
Example #4
0
        public async Task ApplyConfiguration(JToken configJson)
        {
            configData.LoadValuesFromJson(configJson);
            var pairs = new Dictionary <string, string> {
                { "username", configData.Username.Value },
                { "password", configData.Password.Value }
            };
            var request = new Utils.Clients.WebRequest()
            {
                Url      = LoginUrl,
                Type     = RequestType.POST,
                Referer  = SiteLink,
                PostData = pairs
            };
            var response = await webclient.GetString(request);

            CQ  splashDom  = response.Content;
            var link       = splashDom[".trow2 a"].First();
            var resultPage = await RequestStringWithCookies(link.Attr("href"), response.Cookies);

            CQ resultDom = resultPage.Content;

            await ConfigureIfOK(response.Cookies, resultPage.Content.Contains("/logout.php"), () =>
            {
                var tries        = resultDom["#main tr:eq(1) td font"].First().Text();
                var errorMessage = "Incorrect username or password! " + tries + " tries remaining.";
                throw new ExceptionWithConfigData(errorMessage, configData);
            });
        }
Example #5
0
        public async Task ApplyConfiguration(JToken configJson)
        {
            var incomingConfig = new ConfigurationDataBasicLogin();
            incomingConfig.LoadValuesFromJson(configJson);
            var pairs = new Dictionary<string, string> {
                { "username", incomingConfig.Username.Value },
                { "password", incomingConfig.Password.Value }
            };
            var request = new Utils.Clients.WebRequest()
            {
                Url = LoginUrl,
                Type = RequestType.POST,
                Referer = SiteLink,
                PostData = pairs
            };
            var response = await webclient.GetString(request);
            CQ splashDom = response.Content;
            var link = splashDom[".trow2 a"].First();
            var resultPage = await RequestStringWithCookies(link.Attr("href"), response.Cookies);
            CQ resultDom = resultPage.Content;

            await ConfigureIfOK(response.Cookies, resultPage.Content.Contains("/logout.php"), () =>
            {
                var tries = resultDom["#main tr:eq(1) td font"].First().Text();
                var errorMessage = "Incorrect username or password! " + tries + " tries remaining.";
                throw new ExceptionWithConfigData(errorMessage, (ConfigurationData)incomingConfig);
            });
        }
Example #6
0
        public async Task <IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
        {
            configData.LoadValuesFromJson(configJson);
            var pairs = new Dictionary <string, string> {
                { "username", configData.Username.Value },
                { "password", configData.Password.Value }
            };
            var request = new Utils.Clients.WebRequest()
            {
                Url      = SiteLink,
                Type     = RequestType.POST,
                Referer  = SiteLink,
                PostData = pairs
            };
            var response = await webclient.GetString(request);

            var firstCallCookies = response.Cookies;

            // Redirect to ? then to /t
            await FollowIfRedirect(response, request.Url, null, firstCallCookies);

            await ConfigureIfOK(firstCallCookies, response.Content.Contains("/my.php"), () =>
            {
                CQ dom           = response.Content;
                var messageEl    = dom["body > div"].First();
                var errorMessage = messageEl.Text().Trim();
                throw new ExceptionWithConfigData(errorMessage, configData);
            });

            return(IndexerConfigurationStatus.RequiresTesting);
        }
Example #7
0
        public async Task ApplyConfiguration(JToken configJson)
        {
            var config = new ConfigurationDataBasicLoginAnimeBytes();
            config.LoadValuesFromJson(configJson);

            lock (cache)
            {
                cache.Clear();
            }

            // Get the login form as we need the CSRF Token
            var loginPage = await webclient.GetString(new Utils.Clients.WebRequest()
            {
                Url = LoginUrl
            });

            CQ loginPageDom =loginPage.Content;
            var csrfToken = loginPageDom["input[name=\"csrf_token\"]"].Last();

            // Build login form
            var pairs = new Dictionary<string, string> {
                    { "csrf_token", csrfToken.Attr("value") },
				    { "username", config.Username.Value },
				    { "password", config.Password.Value },
                    { "keeplogged_sent", "true" },
                    { "keeplogged", "on" },
                    { "login", "Log In!" }
			};

            // Do the login
            var request = new Utils.Clients.WebRequest()
            {
                Cookies = loginPage.Cookies,
                PostData = pairs,
                Referer = LoginUrl,
                Type = RequestType.POST,
                Url = LoginUrl
            };
            var response = await RequestLoginAndFollowRedirect(LoginUrl, pairs, loginPage.Cookies, true, null);

            // Follow the redirect
            await FollowIfRedirect(response, request.Url, SearchUrl);

            if (!(response.Content != null && response.Content.Contains("/user/logout")))
            {
                // Their login page appears to be broken and just gives a 500 error.
                throw new ExceptionWithConfigData("Failed to login, 6 failed attempts will get you banned for 6 hours.", (ConfigurationData)config);
            }
            else
            {
                cookieHeader = response.Cookies;
                AllowRaws = config.IncludeRaw.Value;
                var configSaveData = new JObject();
                configSaveData["cookies"] = cookieHeader;
                configSaveData["raws"] = AllowRaws;
                SaveConfig(configSaveData);
                IsConfigured = true;
            }
        }
Example #8
0
        public override async Task <IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
        {
            LoadValuesFromJson(configJson);
            var pairs = new Dictionary <string, string> {
                { "username", configData.Username.Value },
                { "password", configData.Password.Value },
                { "g-recaptcha-response", configData.Captcha.Value }
            };

            if (!string.IsNullOrWhiteSpace(configData.Captcha.Cookie))
            {
                CookieHeader = configData.Captcha.Cookie;
                try
                {
                    var results = await PerformQuery(new TorznabQuery());

                    if (results.Count() == 0)
                    {
                        throw new Exception("Your cookie did not work");
                    }

                    IsConfigured = true;
                    SaveConfig();
                    return(IndexerConfigurationStatus.Completed);
                }
                catch (Exception e)
                {
                    IsConfigured = false;
                    throw new Exception("Your cookie did not work: " + e.Message);
                }
            }

            var request = new Utils.Clients.WebRequest()
            {
                Url      = TakeLoginUrl,
                Type     = RequestType.POST,
                Referer  = SiteLink,
                Encoding = Encoding,
                PostData = pairs
            };
            var response = await webclient.GetString(request);

            var firstCallCookies = response.Cookies;

            // Redirect to ? then to /t
            await FollowIfRedirect(response, request.Url, null, firstCallCookies);

            await ConfigureIfOK(firstCallCookies, response.Content.Contains("/lout.php"), () =>
            {
                CQ dom           = response.Content;
                var messageEl    = dom["body > div"].First();
                var errorMessage = messageEl.Text().Trim();
                throw new ExceptionWithConfigData(errorMessage, configData);
            });

            return(IndexerConfigurationStatus.RequiresTesting);
        }
Example #9
0
        public override async Task <IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
        {
            LoadValuesFromJson(configJson);

            lock (cache)
            {
                cache.Clear();
            }

            // Get the login form as we need the CSRF Token
            var loginPage = await webclient.GetString(new Utils.Clients.WebRequest()
            {
                Url            = LoginUrl,
                Encoding       = Encoding,
                EmulateBrowser = true
            });

            CQ  loginPageDom = loginPage.Content;
            var csrfIndex    = loginPageDom["input[name=\"_CSRF_INDEX\"]"].Last();
            var csrfToken    = loginPageDom["input[name=\"_CSRF_TOKEN\"]"].Last();

            // Build login form
            var pairs = new Dictionary <string, string> {
                { "_CSRF_INDEX", csrfIndex.Attr("value") },
                { "_CSRF_TOKEN", csrfToken.Attr("value") },
                { "username", configData.Username.Value },
                { "password", configData.Password.Value },
                { "keeplogged_sent", "true" },
                { "keeplogged", "on" },
                { "login", "Log In!" }
            };

            // Do the login
            var request = new Utils.Clients.WebRequest()
            {
                Cookies        = loginPage.Cookies,
                PostData       = pairs,
                Referer        = LoginUrl,
                Type           = RequestType.POST,
                Encoding       = Encoding,
                Url            = LoginUrl,
                EmulateBrowser = true
            };
            var response = await RequestLoginAndFollowRedirect(LoginUrl, pairs, loginPage.Cookies, true, null);

            // Follow the redirect
            await FollowIfRedirect(response, request.Url, SearchUrl);

            await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("/user/logout"), () =>
            {
                // Their login page appears to be broken and just gives a 500 error.
                throw new ExceptionWithConfigData("Failed to login, 6 failed attempts will get you banned for 6 hours.", configData);
            });

            return(IndexerConfigurationStatus.RequiresTesting);
        }
Example #10
0
        protected async Task <WebClientStringResult> PostDataWithCookies(string url, IEnumerable <KeyValuePair <string, string> > data, string cookieOverride = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url      = url,
                Type     = RequestType.POST,
                Cookies  = cookieOverride ?? CookieHeader,
                PostData = data
            };

            return(await webclient.GetString(request));
        }
Example #11
0
        protected async Task <WebClientByteResult> RequestBytesWithCookies(string url, string cookieOverride = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url     = url,
                Type    = RequestType.GET,
                Cookies = cookieOverride ?? CookieHeader
            };

            if (cookieOverride != null)
            {
                request.Cookies = cookieOverride;
            }
            return(await webclient.GetBytes(request));
        }
Example #12
0
        protected async Task <WebClientStringResult> RequestStringWithCookies(string url, string cookieOverride = null, string referer = null, Dictionary <string, string> headers = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url     = url,
                Type    = RequestType.GET,
                Cookies = CookieHeader,
                Referer = referer,
                Headers = headers
            };

            if (cookieOverride != null)
            {
                request.Cookies = cookieOverride;
            }
            return(await webclient.GetString(request));
        }
Example #13
0
        protected async Task <WebClientByteResult> RequestBytesWithCookies(string url, string cookieOverride = null, RequestType method = RequestType.GET, string referer = null, IEnumerable <KeyValuePair <string, string> > data = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url      = url,
                Type     = method,
                Cookies  = cookieOverride ?? CookieHeader,
                PostData = data,
                Referer  = referer,
                Encoding = Encoding
            };

            if (cookieOverride != null)
            {
                request.Cookies = cookieOverride;
            }
            return(await webclient.GetBytes(request));
        }
Example #14
0
        protected async Task <WebClientStringResult> PostDataWithCookies(string url, IEnumerable <KeyValuePair <string, string> > data, string cookieOverride = null, string referer = null, Dictionary <string, string> headers = null, string rawbody = null, bool?emulateBrowser = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url      = url,
                Type     = RequestType.POST,
                Cookies  = cookieOverride ?? CookieHeader,
                PostData = data,
                Referer  = referer,
                Headers  = headers,
                RawBody  = rawbody
            };

            if (emulateBrowser.HasValue)
            {
                request.EmulateBrowser = emulateBrowser.Value;
            }
            return(await webclient.GetString(request));
        }
Example #15
0
        protected async Task<WebClientStringResult> RequestStringWithCookies(string url, string cookieOverride = null, string referer = null, Dictionary<string, string> headers = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url = url,
                Type = RequestType.GET,
                Cookies = CookieHeader,
                Referer = referer,
                Headers = headers,
                Encoding = Encoding
            };

            if (cookieOverride != null)
                request.Cookies = cookieOverride;
            WebClientStringResult result = await webclient.GetString(request);
            CheckTrackerDown(result);
            UpdateCookieHeader(result.Cookies, cookieOverride);
            return result;
        }
Example #16
0
        protected virtual async Task<WebClientByteResult> RequestBytesWithCookies(string url, string cookieOverride = null, RequestType method = RequestType.GET, string referer = null, IEnumerable<KeyValuePair<string, string>> data = null, Dictionary<string, string> headers = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url = url,
                Type = method,
                Cookies = cookieOverride ?? CookieHeader,
                PostData = data,
                Referer = referer,
                Headers = headers,
                Encoding = Encoding
            };

            if (cookieOverride != null)
                request.Cookies = cookieOverride;
            var result = await webclient.GetBytes(request);
            UpdateCookieHeader(result.Cookies, cookieOverride);
            return result;
        }
Example #17
0
        /// <summary>
        /// Get Torrents Page from Tracker by Query Provided
        /// </summary>
        /// <param name="request">URL created by Query Builder</param>
        /// <returns>Results from query</returns>
        private async Task <String> QueryTracker(string request)
        {
            // Cache mode not enabled or cached file didn't exist for our query
            Output("\nQuerying tracker for results....");

            // Build WebRequest for index
            var myIndexRequest = new Utils.Clients.WebRequest()
            {
                Type     = RequestType.GET,
                Url      = request,
                Encoding = Encoding,
                Headers  = EmulatedBrowserHeaders
            };

            // Request our first page
            var results = await webclient.GetString(myIndexRequest);

            // Return results from tracker
            return(results.Content);
        }
Example #18
0
        protected async new Task <WebClientByteResult> RequestStringWithCookies(string url, string cookieOverride = null, string referer = null, Dictionary <string, string> headers = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url     = url,
                Type    = RequestType.GET,
                Cookies = CookieHeader,
                Referer = referer,
                Headers = headers
            };

            if (cookieOverride != null)
            {
                request.Cookies = cookieOverride;
            }
            WebClientByteResult result = await webclient.GetBytes(request);

            UpdateCookieHeader(result.Cookies, cookieOverride);
            return(result);
        }
Example #19
0
        protected async Task<WebClientStringResult> PostDataWithCookies(string url, IEnumerable<KeyValuePair<string, string>> data, string cookieOverride = null, string referer = null, Dictionary<string, string> headers = null, string rawbody = null, bool? emulateBrowser = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url = url,
                Type = RequestType.POST,
                Cookies = cookieOverride ?? CookieHeader,
                PostData = data,
                Referer = referer,
                Headers = headers,
                RawBody = rawbody,
                Encoding = Encoding
            };

            if (emulateBrowser.HasValue)
                request.EmulateBrowser = emulateBrowser.Value;
            WebClientStringResult result = await webclient.GetString(request);
            CheckTrackerDown(result);
            UpdateCookieHeader(result.Cookies, cookieOverride);
            return result;
        }
Example #20
0
        /// <summary>
        /// Perform login to racker
        /// </summary>
        /// <returns></returns>
        private async Task DoLogin()
        {
            // Build WebRequest for index
            var myIndexRequest = new Utils.Clients.WebRequest()
            {
                Type     = RequestType.GET,
                Url      = SiteLink,
                Headers  = _emulatedBrowserHeaders,
                Encoding = Encoding
            };

            // Get index page for cookies
            Output("\nGetting index page (for cookies).. with " + SiteLink);
            var indexPage = await webclient.GetString(myIndexRequest);

            // Building login form data
            var pairs = new Dictionary <string, string> {
                { "username", ConfigData.Username.Value },
                { "password", ConfigData.Password.Value }
            };

            // Build WebRequest for login
            var myRequestLogin = new Utils.Clients.WebRequest()
            {
                Type     = RequestType.GET,
                Url      = LoginUrl,
                Headers  = _emulatedBrowserHeaders,
                Cookies  = indexPage.Cookies,
                Referer  = SiteLink,
                Encoding = Encoding
            };

            // Get login page -- (not used, but simulation needed by tracker security's checks)
            LatencyNow();
            Output("\nGetting login page (user simulation).. with " + LoginUrl);
            await webclient.GetString(myRequestLogin);

            // Build WebRequest for submitting authentification
            var request = new Utils.Clients.WebRequest()
            {
                PostData = pairs,
                Referer  = LoginUrl,
                Type     = RequestType.POST,
                Url      = LoginCheckUrl,
                Headers  = _emulatedBrowserHeaders,
                Cookies  = indexPage.Cookies,
                Encoding = Encoding
            };

            // Perform loggin
            LatencyNow();
            Output("\nPerform loggin.. with " + LoginCheckUrl);
            var response = await webclient.GetString(request);

            // Test if we are logged in
            await ConfigureIfOK(response.Cookies, response.Cookies != null && response.Cookies.Contains("uid="), () =>
            {
                // Default error message
                var message = "Error during attempt !";
                // Parse redirect header
                var redirectTo = response.RedirectingTo;

                // Oops, unable to login
                Output("-> Login failed: " + message, "error");
                throw new ExceptionWithConfigData("Login failed: " + message, configData);
            });

            Output("\nCookies saved for future uses...");
            ConfigData.CookieHeader.Value = indexPage.Cookies + " " + response.Cookies + " ts_username="******"\n-> Login Success\n");
        }
Example #21
0
        public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
        {
            configData.LoadValuesFromJson(configJson);
            var pairs = new Dictionary<string, string> {
                { "username", configData.Username.Value },
                { "password", configData.Password.Value },
                { "g-recaptcha-response", configData.Captcha.Value }
            };

            if (!string.IsNullOrWhiteSpace(configData.Captcha.Cookie))
            {
                CookieHeader = configData.Captcha.Cookie;
                try
                {
                    var results = await PerformQuery(new TorznabQuery());
                    if (results.Count() == 0)
                    {
                        throw new Exception("Your cookie did not work");
                    }

                    SaveConfig();
                    IsConfigured = true;
                    return IndexerConfigurationStatus.Completed;
                }
                catch (Exception e)
                {
                    IsConfigured = false;
                    throw new Exception("Your cookie did not work: " + e.Message);
                }
            }

            var request = new Utils.Clients.WebRequest()
            {
                Url = TakeLoginUrl,
                Type = RequestType.POST,
                Referer = UseLink,
                PostData = pairs
            };
            var response = await webclient.GetString(request);
            var firstCallCookies = response.Cookies;
            // Redirect to ? then to /t
            await FollowIfRedirect(response, request.Url, null, firstCallCookies);

            await ConfigureIfOK(firstCallCookies, response.Content.Contains("/my.php"), () =>
            {
                CQ dom = response.Content;
                var messageEl = dom["body > div"].First();
                var errorMessage = messageEl.Text().Trim();
                throw new ExceptionWithConfigData(errorMessage, configData);
            });
            return IndexerConfigurationStatus.RequiresTesting;
        }
Example #22
0
        protected async Task<WebClientStringResult> RequestLoginAndFollowRedirect(string url, IEnumerable<KeyValuePair<string, string>> data, string cookies, bool returnCookiesFromFirstCall, string redirectUrlOverride = null, string referer = null, bool accumulateCookies = false)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url = url,
                Type = RequestType.POST,
                Cookies = cookies,
                Referer = referer,
                PostData = data,
                Encoding = Encoding
            };
            var response = await webclient.GetString(request);
            if (accumulateCookies)
            {
                response.Cookies = ResolveCookies((request.Cookies == null ? "" : request.Cookies + " ") + response.Cookies);
            }
            var firstCallCookies = response.Cookies;

            if (response.IsRedirect)
            {
                await FollowIfRedirect(response, request.Url, redirectUrlOverride, response.Cookies, accumulateCookies);
            }

            if (returnCookiesFromFirstCall)
            {
                response.Cookies = ResolveCookies(firstCallCookies + (accumulateCookies ? " " + response.Cookies : ""));
            }
            
            return response;
        }
Example #23
0
        public async Task <HttpResponseMessage> Call(string indexerID, [FromUri] TorrentPotatoRequest request)
        {
            var indexer = indexerService.GetIndexer(indexerID);

            var allowBadApiDueToDebug = false;

#if DEBUG
            allowBadApiDueToDebug = Debugger.IsAttached;
#endif

            if (!allowBadApiDueToDebug && !string.Equals(request.passkey, serverService.Config.APIKey, StringComparison.InvariantCultureIgnoreCase))
            {
                logger.Warn(string.Format("A request from {0} was made with an incorrect API key.", Request.GetOwinContext().Request.RemoteIpAddress));
                return(Request.CreateResponse(HttpStatusCode.Forbidden, "Incorrect API key"));
            }

            if (!indexer.IsConfigured)
            {
                logger.Warn(string.Format("Rejected a request to {0} which is unconfigured.", indexer.DisplayName));
                return(Request.CreateResponse(HttpStatusCode.Forbidden, "This indexer is not configured."));
            }

            if (!indexer.TorznabCaps.Categories.Select(c => c.ID).Any(i => MOVIE_CATS.Contains(i)))
            {
                logger.Warn(string.Format("Rejected a request to {0} which does not support searching for movies.", indexer.DisplayName));
                return(Request.CreateResponse(HttpStatusCode.Forbidden, "This indexer does not support movies."));
            }

            var year = 0;

            if (string.IsNullOrWhiteSpace(request.search))
            {
                // We are searching by IMDB id so look up the name
                var omdbapiRequest = new Utils.Clients.WebRequest("http://www.omdbapi.com/?type=movie&i=" + request.imdbid);
                omdbapiRequest.Encoding = Encoding.UTF8;
                var response = await webClient.GetString(omdbapiRequest);

                if (response.Status == HttpStatusCode.OK)
                {
                    JObject result = JObject.Parse(response.Content);
                    if (result["Title"] != null)
                    {
                        request.search = result["Title"].ToString();
                        year           = ParseUtil.CoerceInt(result["Year"].ToString());
                    }
                }
            }

            var torznabQuery = new TorznabQuery()
            {
                ApiKey     = request.passkey,
                Categories = MOVIE_CATS,
                SearchTerm = request.search,
                ImdbID     = request.imdbid,
                QueryType  = "TorrentPotato"
            };

            IEnumerable <ReleaseInfo> releases = new List <ReleaseInfo>();

            if (!string.IsNullOrWhiteSpace(torznabQuery.SanitizedSearchTerm))
            {
                releases = await indexer.PerformQuery(torznabQuery);

                releases = indexer.CleanLinks(releases);
            }

            // Cache non query results
            if (string.IsNullOrEmpty(torznabQuery.SanitizedSearchTerm))
            {
                cacheService.CacheRssResults(indexer, releases);
            }

            releases = indexer.FilterResults(torznabQuery, releases);
            var serverUrl      = string.Format("{0}://{1}:{2}{3}", Request.RequestUri.Scheme, Request.RequestUri.Host, Request.RequestUri.Port, serverService.BasePath());
            var potatoResponse = new TorrentPotatoResponse();

            releases = TorznabUtil.FilterResultsToTitle(releases, torznabQuery.SanitizedSearchTerm, year);
            releases = TorznabUtil.FilterResultsToImdb(releases, request.imdbid);

            foreach (var r in releases)
            {
                var release = Mapper.Map <ReleaseInfo>(r);
                release.Link = serverService.ConvertToProxyLink(release.Link, serverUrl, indexerID, "dl", release.Title + ".torrent");

                // Only accept torrent links, magnet is not supported
                if (release.Link != null)
                {
                    potatoResponse.results.Add(new TorrentPotatoResponseItem()
                    {
                        release_name = release.Title + "[" + indexer.DisplayName + "]", // Suffix the indexer so we can see which tracker we are using in CPS as it just says torrentpotato >.>
                        torrent_id   = release.Guid.ToString(),
                        details_url  = release.Comments.ToString(),
                        download_url = release.Link.ToString(),
                        imdb_id      = release.Imdb.HasValue ? "tt" + release.Imdb : null,
                        freeleech    = (release.DownloadVolumeFactor == 0 ? true : false),
                        type         = "movie",
                        size         = (long)release.Size / (1024 * 1024), // This is in MB
                        leechers     = (int)release.Peers - (int)release.Seeders,
                        seeders      = (int)release.Seeders,
                        publish_date = r.PublishDate == DateTime.MinValue ? null : release.PublishDate.ToUniversalTime().ToString("s")
                    });
                }
            }

            // Log info
            if (string.IsNullOrWhiteSpace(torznabQuery.SanitizedSearchTerm))
            {
                logger.Info(string.Format("Found {0} torrentpotato releases from {1}", releases.Count(), indexer.DisplayName));
            }
            else
            {
                logger.Info(string.Format("Found {0} torrentpotato releases from {1} for: {2}", releases.Count(), indexer.DisplayName, torznabQuery.GetQueryString()));
            }

            // Force the return as Json
            return(new HttpResponseMessage()
            {
                Content = new JsonContent(potatoResponse)
            });
        }
Example #24
0
        /// <summary>
        /// Configure our SceneFZ Provider
        /// </summary>
        /// <param name="configJson">Our params in Json</param>
        /// <returns>Configuration state</returns>
        public override async Task <IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
        {
            try
            {
                // Retrieve config values set by Jackett's user
                LoadValuesFromJson(configJson);

                // Check & Validate Config
                validateConfig();

                // Setting our data for a better emulated browser (maximum security)
                // TODO: Encoded Content not supported by Jackett at this time
                // emulatedBrowserHeaders.Add("Accept-Encoding", "gzip, deflate");

                // If we want to simulate a browser
                if (ConfigData.Browser.Value)
                {
                    // Clean headers
                    emulatedBrowserHeaders.Clear();

                    // Inject headers
                    emulatedBrowserHeaders.Add("Accept", ConfigData.HeaderAccept.Value);
                    emulatedBrowserHeaders.Add("Accept-Language", ConfigData.HeaderAcceptLang.Value);
                    emulatedBrowserHeaders.Add("DNT", Convert.ToInt32(ConfigData.HeaderDNT.Value).ToString());
                    emulatedBrowserHeaders.Add("Upgrade-Insecure-Requests", Convert.ToInt32(ConfigData.HeaderUpgradeInsecure.Value).ToString());
                    emulatedBrowserHeaders.Add("User-Agent", ConfigData.HeaderUserAgent.Value);
                }

                // Building login form data
                var pairs = new Dictionary <string, string> {
                    { "username", ConfigData.Username.Value },
                    { "password", ConfigData.Password.Value },
                    { "submitme", "X" },
                    { "returnto", "%2F" }
                };

                // Getting login form to retrieve PHPSESSID
                var myRequest = new Utils.Clients.WebRequest()
                {
                    Url = LoginUrl
                };

                // Add our headers to request
                myRequest.Headers = emulatedBrowserHeaders;

                // Get login page
                var loginPage = await webclient.GetString(myRequest);

                // Do the login
                var request = new Utils.Clients.WebRequest()
                {
                    Cookies  = loginPage.Cookies,
                    PostData = pairs,
                    Referer  = LoginUrl,
                    Type     = RequestType.POST,
                    Url      = LoginCheckUrl,
                    Headers  = emulatedBrowserHeaders
                };

                // Perform loggin
                latencyNow();
                output("\nPerform login.. with " + LoginCheckUrl);
                // Get login page
                var response = await webclient.GetString(request);

                output("\nTesting if we are logged...");
                await ConfigureIfOK(response.Cookies, response.Cookies != null && response.Cookies.Contains("uid="), () =>
                {
                    output("-> Login Failed: Wrong username or Password");
                    throw new ExceptionWithConfigData("Wrong username or Password", configData);
                });

                output("-> Login Success");

                return(IndexerConfigurationStatus.RequiresTesting);
            }
            catch (Exception e)
            {
                IsConfigured = false;
                Console.WriteLine("Exception thrown : {0}.", e.Message);
                Console.WriteLine(e.StackTrace);
                throw e;
            }
        }
Example #25
0
        protected async Task<WebClientStringResult> PostDataWithCookies(string url, IEnumerable<KeyValuePair<string, string>> data, string cookieOverride = null, string referer = null, Dictionary<string, string> headers = null, string rawbody = null, bool? emulateBrowser = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url = url,
                Type = RequestType.POST,
                Cookies = cookieOverride ?? CookieHeader,
                PostData = data,
                Referer = referer,
                Headers = headers,
                RawBody = rawbody
            };

            if (emulateBrowser.HasValue)
                request.EmulateBrowser = emulateBrowser.Value;
            return await webclient.GetString(request);
        }
Example #26
0
        public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
        {
            configData.LoadValuesFromJson(configJson);

            lock (cache)
            {
                cache.Clear();
            }

            // Get the login form as we need the CSRF Token
            var loginPage = await webclient.GetString(new Utils.Clients.WebRequest()
            {
                Url = LoginUrl
            });

            CQ loginPageDom = loginPage.Content;
            var csrfToken = loginPageDom["input[name=\"csrf_token\"]"].Last();

            // Build login form
            var pairs = new Dictionary<string, string> {
                    { "csrf_token", csrfToken.Attr("value") },
                    { "username", configData.Username.Value },
                    { "password", configData.Password.Value },
                    { "keeplogged_sent", "true" },
                    { "keeplogged", "on" },
                    { "login", "Log In!" }
            };

            // Do the login
            var request = new Utils.Clients.WebRequest()
            {
                Cookies = loginPage.Cookies,
                PostData = pairs,
                Referer = LoginUrl,
                Type = RequestType.POST,
                Url = LoginUrl
            };
            var response = await RequestLoginAndFollowRedirect(LoginUrl, pairs, loginPage.Cookies, true, null);

            // Follow the redirect
            await FollowIfRedirect(response, request.Url, SearchUrl);

            await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("/user/logout"), () =>
            {
                // Their login page appears to be broken and just gives a 500 error.
                throw new ExceptionWithConfigData("Failed to login, 6 failed attempts will get you banned for 6 hours.", configData);
            });

            return IndexerConfigurationStatus.RequiresTesting;
        }
Example #27
0
        /// <summary>
        /// Configure our Provider
        /// </summary>
        /// <param name="configJson">Our params in Json</param>
        /// <returns>Configuration state</returns>
        public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
        {
            // Retrieve config values set by Jackett's user
            ConfigData.LoadValuesFromJson(configJson);

            // Check & Validate Config
            validateConfig();

            // Setting our data for a better emulated browser (maximum security)
            // TODO: Encoded Content not supported by Jackett at this time
            // emulatedBrowserHeaders.Add("Accept-Encoding", "gzip, deflate");

            // If we want to simulate a browser
            if (ConfigData.Browser.Value) {

                // Clean headers
                emulatedBrowserHeaders.Clear();

                // Inject headers
                emulatedBrowserHeaders.Add("Accept", ConfigData.HeaderAccept.Value);
                emulatedBrowserHeaders.Add("Accept-Language", ConfigData.HeaderAcceptLang.Value);
                emulatedBrowserHeaders.Add("DNT", Convert.ToInt32(ConfigData.HeaderDNT.Value).ToString());
                emulatedBrowserHeaders.Add("Upgrade-Insecure-Requests", Convert.ToInt32(ConfigData.HeaderUpgradeInsecure.Value).ToString());
                emulatedBrowserHeaders.Add("User-Agent", ConfigData.HeaderUserAgent.Value);
            }


            // Getting login form to retrieve CSRF token
            /*var myRequest = new Utils.Clients.WebRequest()
            {
                Url = LoginUrl
            };*/

            // Add our headers to request
            //myRequest.Headers = emulatedBrowserHeaders;

            // Building login form data
            var pairs = new Dictionary<string, string> {
                { "username", ConfigData.Username.Value },
                { "password", ConfigData.Password.Value }
            };

            // Do the login
            var request = new Utils.Clients.WebRequest(){
                PostData = pairs,
                Referer = LoginUrl,
                Type = RequestType.POST,
                Url = LoginUrl,
                Headers = emulatedBrowserHeaders
            };

            // Perform loggin
            latencyNow();
            output("\nPerform loggin.. with " + LoginUrl);
            var response = await webclient.GetString(request);

            // Test if we are logged in
            await ConfigureIfOK(response.Cookies, !response.Cookies.Contains("deleted"), () =>
            {
                // Parse error page
                CQ dom = response.Content;
                string message = dom[".error"].Text().Trim().Replace("X\n\t\t", "").Replace("\n\t\tX", "");

                // Oops, unable to login
                output("-> Login failed: \"" + message + "\".", "error");
                throw new ExceptionWithConfigData("Login failed: << " + message + " >>", configData);
            });

            output("-> Login Success");

            return IndexerConfigurationStatus.RequiresTesting;
        }
Example #28
0
        /// <summary>
        /// Configure our WiHD Provider
        /// </summary>
        /// <param name="configJson">Our params in Json</param>
        /// <returns>Configuration state</returns>
        public override async Task <IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
        {
            // Retrieve config values set by Jackett's user
            LoadValuesFromJson(configJson);

            // Check & Validate Config
            validateConfig();

            // Setting our data for a better emulated browser (maximum security)
            // TODO: Encoded Content not supported by Jackett at this time
            // emulatedBrowserHeaders.Add("Accept-Encoding", "gzip, deflate");

            // If we want to simulate a browser
            if (ConfigData.Browser.Value)
            {
                // Clean headers
                emulatedBrowserHeaders.Clear();

                // Inject headers
                emulatedBrowserHeaders.Add("Accept", ConfigData.HeaderAccept.Value);
                emulatedBrowserHeaders.Add("Accept-Language", ConfigData.HeaderAcceptLang.Value);
                emulatedBrowserHeaders.Add("DNT", Convert.ToInt32(ConfigData.HeaderDNT.Value).ToString());
                emulatedBrowserHeaders.Add("Upgrade-Insecure-Requests", Convert.ToInt32(ConfigData.HeaderUpgradeInsecure.Value).ToString());
                emulatedBrowserHeaders.Add("User-Agent", ConfigData.HeaderUserAgent.Value);
            }

            // Getting login form to retrieve CSRF token
            var myRequest = new Utils.Clients.WebRequest()
            {
                Url = LoginUrl
            };

            // Add our headers to request
            myRequest.Headers = emulatedBrowserHeaders;

            // Building login form data
            var pairs = new Dictionary <string, string> {
                { "username", ConfigData.Username.Value },
                { "password", ConfigData.Password.Value },
                { "keeplogged", "1" },
                { "login", "Connexion" }
            };

            // Do the login
            var request = new Utils.Clients.WebRequest()
            {
                PostData = pairs,
                Referer  = LoginUrl,
                Type     = RequestType.POST,
                Url      = LoginUrl,
                Headers  = emulatedBrowserHeaders
            };

            // Perform loggin
            latencyNow();
            output("\nPerform loggin.. with " + LoginUrl);
            var response = await webclient.GetString(request);

            // Test if we are logged in
            await ConfigureIfOK(response.Cookies, response.Cookies.Contains("session="), () =>
            {
                // Parse error page
                CQ dom         = response.Content;
                string message = dom[".warning"].Text().Split('.').Reverse().Skip(1).First();

                // Try left
                string left = dom[".info"].Text().Trim();

                // Oops, unable to login
                output("-> Login failed: \"" + message + "\" and " + left + " tries left before being banned for 6 hours !", "error");
                throw new ExceptionWithConfigData("Login failed: " + message, configData);
            });

            output("-> Login Success");

            return(IndexerConfigurationStatus.RequiresTesting);
        }
Example #29
0
        /// <summary>
        /// Configure our WiHD Provider
        /// </summary>
        /// <param name="configJson">Our params in Json</param>
        /// <returns>Configuration state</returns>
        public async Task <IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
        {
            // Retrieve config values set by Jackett's user
            ConfigData.LoadValuesFromJson(configJson);

            // Check & Validate Config
            validateConfig();

            // Setting our data for a better emulated browser (maximum security)
            // TODO: Encoded Content not supported by Jackett at this time
            // emulatedBrowserHeaders.Add("Accept-Encoding", "gzip, deflate");

            // If we want to simulate a browser
            if (ConfigData.Browser.Value)
            {
                // Clean headers
                emulatedBrowserHeaders.Clear();

                // Inject headers
                emulatedBrowserHeaders.Add("Accept", ConfigData.HeaderAccept.Value);
                emulatedBrowserHeaders.Add("Accept-Language", ConfigData.HeaderAcceptLang.Value);
                emulatedBrowserHeaders.Add("DNT", Convert.ToInt32(ConfigData.HeaderDNT.Value).ToString());
                emulatedBrowserHeaders.Add("Upgrade-Insecure-Requests", Convert.ToInt32(ConfigData.HeaderUpgradeInsecure.Value).ToString());
                emulatedBrowserHeaders.Add("User-Agent", ConfigData.HeaderUserAgent.Value);
            }


            // Getting login form to retrieve CSRF token
            var myRequest = new Utils.Clients.WebRequest()
            {
                Url = LoginUrl
            };

            // Add our headers to request
            myRequest.Headers = emulatedBrowserHeaders;

            // Get login page
            var loginPage = await webclient.GetString(myRequest);

            // Retrieving our CSRF token
            CQ  loginPageDom = loginPage.Content;
            var csrfToken    = loginPageDom["input[name=\"_csrf_token\"]"].Last();

            // Building login form data
            var pairs = new Dictionary <string, string> {
                { "_csrf_token", csrfToken.Attr("value") },
                { "_username", ConfigData.Username.Value },
                { "_password", ConfigData.Password.Value },
                { "_remember_me", "on" },
                { "_submit", "" }
            };

            // Do the login
            var request = new Utils.Clients.WebRequest()
            {
                Cookies  = loginPage.Cookies,
                PostData = pairs,
                Referer  = LoginUrl,
                Type     = RequestType.POST,
                Url      = LoginUrl,
                Headers  = emulatedBrowserHeaders
            };

            // Perform loggin
            latencyNow();
            output("Perform loggin.. with " + LoginCheckUrl);
            var response = await RequestLoginAndFollowRedirect(LoginCheckUrl, pairs, loginPage.Cookies, true, null, null);

            // Test if we are logged in
            await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("/logout"), () => {
                // Oops, unable to login
                throw new ExceptionWithConfigData("Failed to login", configData);
            });

            return(IndexerConfigurationStatus.RequiresTesting);
        }
Example #30
0
        protected async Task<WebClientStringResult> RequestStringWithCookies(string url, string cookieOverride = null, string referer = null, Dictionary<string, string> headers = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url = url,
                Type = RequestType.GET,
                Cookies = CookieHeader,
                Referer = referer,
                 Headers = headers
            };

            if (cookieOverride != null)
                request.Cookies = cookieOverride;
            return await webclient.GetString(request);
        }
Example #31
0
        public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
        {
            configData.LoadValuesFromJson(configJson);
            var pairs = new Dictionary<string, string> {
                { "username", configData.Username.Value },
                { "password", configData.Password.Value }
            };
            var request = new Utils.Clients.WebRequest()
            {
                Url = SiteLink,
                Type = RequestType.POST,
                Referer = SiteLink,
                PostData = pairs
            };
            var response = await webclient.GetString(request);
            var firstCallCookies = response.Cookies;
            // Redirect to ? then to /t
            await FollowIfRedirect(response, request.Url, null, firstCallCookies);

            await ConfigureIfOK(firstCallCookies, response.Content.Contains("/my.php"), () =>
            {
                CQ dom = response.Content;
                var messageEl = dom["body > div"].First();
                var errorMessage = messageEl.Text().Trim();
                throw new ExceptionWithConfigData(errorMessage, configData);
            });
            return IndexerConfigurationStatus.RequiresTesting;
        }
Example #32
0
        protected async Task<WebClientByteResult> RequestBytesWithCookies(string url, string cookieOverride = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url = url,
                Type = RequestType.GET,
                Cookies = cookieOverride ?? CookieHeader
            };

            if (cookieOverride != null)
                request.Cookies = cookieOverride;
            return await webclient.GetBytes(request);
        }
Example #33
0
 protected async Task<WebClientStringResult> PostDataWithCookies(string url, Dictionary<string, string> data, string cookieOverride = null)
 {
     var request = new Utils.Clients.WebRequest()
     {
         Url = url,
         Type = RequestType.POST,
         Cookies = cookieOverride ?? cookieHeader,
         PostData = data
     };
     return await webclient.GetString(request);
 }
Example #34
0
        protected async Task<WebClientStringResult> RequestLoginAndFollowRedirect(string url, IEnumerable<KeyValuePair<string, string>> data, string cookies, bool returnCookiesFromFirstCall, string redirectUrlOverride = null, string referer = null)
        {
            var request = new Utils.Clients.WebRequest()
            {
                Url = url,
                Type = RequestType.POST,
                Cookies = cookies,
                Referer = referer,
                PostData = data
            };
            var response = await webclient.GetString(request);
            var firstCallCookies = response.Cookies;

            if (response.IsRedirect)
            {
                await FollowIfRedirect(response, request.Url, redirectUrlOverride, response.Cookies);
            }

            if (returnCookiesFromFirstCall)
            {
                response.Cookies = firstCallCookies;
            }

            return response;
        }
Example #35
0
        /// <summary>
        /// Configure our WiHD Provider
        /// </summary>
        /// <param name="configJson">Our params in Json</param>
        /// <returns>Configuration state</returns>
        public async Task<IndexerConfigurationStatus> ApplyConfiguration(JToken configJson)
        {
            // Retrieve config values set by Jackett's user
            ConfigData.LoadValuesFromJson(configJson);

            // Check & Validate Config
            validateConfig();

            // Setting our data for a better emulated browser (maximum security)
            // TODO: Encoded Content not supported by Jackett at this time
            // emulatedBrowserHeaders.Add("Accept-Encoding", "gzip, deflate");

            // If we want to simulate a browser
            if (ConfigData.Browser.Value) {

                // Clean headers
                emulatedBrowserHeaders.Clear();

                // Inject headers
                emulatedBrowserHeaders.Add("Accept", ConfigData.HeaderAccept.Value);
                emulatedBrowserHeaders.Add("Accept-Language", ConfigData.HeaderAcceptLang.Value);
                emulatedBrowserHeaders.Add("DNT", Convert.ToInt32(ConfigData.HeaderDNT.Value).ToString());
                emulatedBrowserHeaders.Add("Upgrade-Insecure-Requests", Convert.ToInt32(ConfigData.HeaderUpgradeInsecure.Value).ToString());
                emulatedBrowserHeaders.Add("User-Agent", ConfigData.HeaderUserAgent.Value);
            }


            // Getting login form to retrieve CSRF token
            var myRequest = new Utils.Clients.WebRequest()
            {
                Url = LoginUrl
            };

            // Add our headers to request
            myRequest.Headers = emulatedBrowserHeaders;

            // Get login page
            var loginPage = await webclient.GetString(myRequest);

            // Retrieving our CSRF token
            CQ loginPageDom = loginPage.Content;
            var csrfToken = loginPageDom["input[name=\"_csrf_token\"]"].Last();

            // Building login form data
            var pairs = new Dictionary<string, string> {
                { "_csrf_token", csrfToken.Attr("value") },
                { "_username", ConfigData.Username.Value },
                { "_password", ConfigData.Password.Value },
                { "_remember_me", "on" },
                { "_submit", "" }
            };

            // Do the login
            var request = new Utils.Clients.WebRequest(){
                Cookies = loginPage.Cookies,
                PostData = pairs,
                Referer = LoginUrl,
                Type = RequestType.POST,
                Url = LoginUrl,
                Headers = emulatedBrowserHeaders
            };

            // Perform loggin
            latencyNow();
            output("\nPerform loggin.. with " + LoginCheckUrl);
            var response = await RequestLoginAndFollowRedirect(LoginCheckUrl, pairs, loginPage.Cookies, true, null, null);

            // Test if we are logged in
            await ConfigureIfOK(response.Cookies, response.Content != null && response.Content.Contains("/logout"), () => 
            {
                // Oops, unable to login
                output("-> Login failed", "error");
                throw new ExceptionWithConfigData("Failed to login", configData);
            });

            output("-> Login Success");

            return IndexerConfigurationStatus.RequiresTesting;
        }