public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse) { var results = new List<ReleaseInfo>(); switch (indexerResponse.HttpResponse.StatusCode) { case HttpStatusCode.Unauthorized: throw new ApiKeyException("API Key invalid or not authorized"); case HttpStatusCode.NotFound: throw new IndexerException(indexerResponse, "Indexer API call returned NotFound, the Indexer API may have changed."); case HttpStatusCode.ServiceUnavailable: throw new RequestLimitReachedException("Cannot do more than 150 API requests per hour."); default: if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK) { throw new IndexerException(indexerResponse, "Indexer API call returned an unexpected StatusCode [{0}]", indexerResponse.HttpResponse.StatusCode); } break; } var jsonResponse = new HttpResponse<JsonRpcResponse<BroadcastheNetTorrents>>(indexerResponse.HttpResponse).Resource; if (jsonResponse.Error != null || jsonResponse.Result == null) { throw new IndexerException(indexerResponse, "Indexer API call returned an error [{0}]", jsonResponse.Error); } if (jsonResponse.Result.Results == 0) { return results; } var protocol = indexerResponse.HttpRequest.Url.Scheme + ":"; foreach (var torrent in jsonResponse.Result.Torrents.Values) { var torrentInfo = new TorrentInfo(); torrentInfo.Guid = string.Format("BTN-{0}", torrent.TorrentID); torrentInfo.Title = torrent.ReleaseName; torrentInfo.Size = torrent.Size; torrentInfo.DownloadUrl = RegexProtocol.Replace(torrent.DownloadURL, protocol); torrentInfo.InfoUrl = string.Format("{0}//broadcasthe.net/torrents.php?id={1}&torrentid={2}", protocol, torrent.GroupID, torrent.TorrentID); //torrentInfo.CommentUrl = if (torrent.TvrageID.HasValue) { torrentInfo.TvRageId = torrent.TvrageID.Value; } torrentInfo.PublishDate = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).ToUniversalTime().AddSeconds(torrent.Time); //torrentInfo.MagnetUrl = torrentInfo.InfoHash = torrent.InfoHash; torrentInfo.Seeders = torrent.Seeders; torrentInfo.Peers = torrent.Leechers + torrent.Seeders; results.Add(torrentInfo); } return results; }
public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse) { var results = new List<ReleaseInfo>(); switch (indexerResponse.HttpResponse.StatusCode) { default: if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK) { throw new IndexerException(indexerResponse, "Indexer API call returned an unexpected StatusCode [{0}]", indexerResponse.HttpResponse.StatusCode); } break; } var jsonResponse = new HttpResponse<RarbgResponse>(indexerResponse.HttpResponse); if (jsonResponse.Resource.error_code.HasValue) { if (jsonResponse.Resource.error_code == 20 || jsonResponse.Resource.error_code == 8) { // No results found return results; } throw new IndexerException(indexerResponse, "Indexer API call returned error {0}: {1}", jsonResponse.Resource.error_code, jsonResponse.Resource.error); } if (jsonResponse.Resource.torrent_results == null) { return results; } foreach (var torrent in jsonResponse.Resource.torrent_results) { var torrentInfo = new TorrentInfo(); torrentInfo.Guid = GetGuid(torrent); torrentInfo.Title = torrent.title; torrentInfo.Size = torrent.size; torrentInfo.DownloadUrl = torrent.download; torrentInfo.InfoUrl = torrent.info_page; torrentInfo.PublishDate = torrent.pubdate; torrentInfo.Seeders = torrent.seeders; torrentInfo.Peers = torrent.leechers + torrent.seeders; if (torrent.episode_info != null && torrent.episode_info.tvrage != null) { torrentInfo.TvRageId = torrent.episode_info.tvrage.Value; } results.Add(torrentInfo); } return results; }
public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse) { var results = new List<ReleaseInfo>(); switch (indexerResponse.HttpResponse.StatusCode) { case HttpStatusCode.Unauthorized: throw new ApiKeyException("API Key invalid or not authorized"); case HttpStatusCode.NotFound: throw new IndexerException(indexerResponse, "Indexer API call returned NotFound, the Indexer API may have changed."); case HttpStatusCode.ServiceUnavailable: throw new RequestLimitReachedException("Indexer API is temporarily unavailable, try again later"); default: if (indexerResponse.HttpResponse.StatusCode != HttpStatusCode.OK) { throw new IndexerException(indexerResponse, "Indexer API call returned an unexpected StatusCode [{0}]", indexerResponse.HttpResponse.StatusCode); } break; } var content = indexerResponse.HttpResponse.Content; var parsed = Json.Deserialize<TitansOfTvApiResult>(content); var protocol = indexerResponse.HttpRequest.Url.Scheme + ":"; foreach (var parsedItem in parsed.results) { var release = new TorrentInfo(); release.Guid = string.Format("ToTV-{0}", parsedItem.id); release.DownloadUrl = RegexProtocol.Replace(parsedItem.download, protocol); release.InfoUrl = RegexProtocol.Replace(parsedItem.episodeUrl, protocol); if (parsedItem.commentUrl.IsNotNullOrWhiteSpace()) { release.CommentUrl = RegexProtocol.Replace(parsedItem.commentUrl, protocol); } release.DownloadProtocol = DownloadProtocol.Torrent; release.Title = parsedItem.release_name; release.Size = parsedItem.size; release.Seeders = parsedItem.seeders; release.Peers = parsedItem.leechers + release.Seeders; release.PublishDate = parsedItem.created_at; results.Add(release); } return results; }
private void ValidateReleaseSize(TorrentInfo[] releases, TorrentRssIndexerSettings indexerSettings) { if (!indexerSettings.AllowZeroSize && releases.Any(r => r.Size == 0)) { throw new UnsupportedFeedException("Feed doesn't contain the release content size."); } if (releases.Any(r => r.Size != 0 && r.Size < ValidSizeThreshold)) { throw new UnsupportedFeedException("Size of one more releases lower than {0}, feed must contain release content size.", ValidSizeThreshold.SizeSuffix()); } }
private void ValidateReleases(TorrentInfo[] releases, TorrentRssIndexerSettings indexerSettings) { if (releases == null || releases.Empty()) { throw new UnsupportedFeedException("Empty feed, cannot check if feed is parsable."); } var torrentInfo = releases.First(); _logger.Trace("TorrentInfo: \n{0}", torrentInfo.ToString("L")); if (releases.Any(r => r.Title.IsNullOrWhiteSpace())) { throw new UnsupportedFeedException("Feed contains releases without title."); } if (releases.Any(r => !IsValidDownloadUrl(r.DownloadUrl))) { throw new UnsupportedFeedException("Failed to find a valid download url in the feed."); } var total = releases.Where(v => v.Guid != null).Select(v => v.Guid).ToArray(); var distinct = total.Distinct().ToArray(); if (distinct.Length != total.Length) { throw new UnsupportedFeedException("Feed contains releases with same guid, rejecting malformed rss feed."); } }
public static ReleaseInfo ToModel(this ReleaseResource resource) { ReleaseInfo model; if (resource.Protocol == DownloadProtocol.Torrent) { model = new TorrentInfo { MagnetUrl = resource.MagnetUrl, InfoHash = resource.InfoHash, Seeders = resource.Seeders, Peers = (resource.Seeders.HasValue && resource.Leechers.HasValue) ? (resource.Seeders + resource.Leechers) : null }; } else { model = new ReleaseInfo(); } model.Guid = resource.Guid; model.Title = resource.Title; model.Size = resource.Size; model.DownloadUrl = resource.DownloadUrl; model.InfoUrl = resource.InfoUrl; model.CommentUrl = resource.CommentUrl; model.IndexerId = resource.IndexerId; model.Indexer = resource.Indexer; model.DownloadProtocol = resource.DownloadProtocol; model.TvdbId = resource.TvdbId; model.TvRageId = resource.TvRageId; model.PublishDate = resource.PublishDate; return model; }