@Override protected List<SearchResultItem> getSearchResultItems(Xml rssRoot) { List<SearchResultItem> searchResultItems = new ArrayList<>(); for (NewznabXmlItem item : ((NewznabXmlRoot) rssRoot).getRssChannel().getItems()) { try { SearchResultItem searchResultItem = createSearchResultItem(item); searchResultItems.add(searchResultItem); } catch (NzbHydraException e) { //Already logged } } return searchResultItems; }
public NewznabXmlRoot build() { NewznabXmlRoot rssRoot = new NewznabXmlRoot(); rssChannel.getItems().addAll(items); rssRoot.setRssChannel(rssChannel); return rssRoot; } }
protected boolean isNewznabResult(NewznabXmlRoot rssRoot) { return rssRoot.getRssChannel().getItems().stream().anyMatch(x -> x.getEnclosures().stream().anyMatch(enclosure -> "application/x-nzb".equals(enclosure.getType()))); }
protected boolean isTorznabResult(NewznabXmlRoot rssRoot) { return rssRoot.getRssChannel().getItems().stream().anyMatch(x -> x.getEnclosures().stream().anyMatch(enclosure -> "application/x-bittorrent".equals(enclosure.getType())) || !x.getTorznabAttributes().isEmpty()); }
@RequestMapping(value = "/torznab/api", produces = MediaType.TEXT_XML_VALUE) public ResponseEntity<? extends Object> torznabapi(NewznabParameters params) throws Exception { if (params.getT() == ActionAttribute.CAPS) { return new ResponseEntity<Object>(NewznabMockBuilder.getCaps(), HttpStatus.OK); } NewznabXmlRoot rssRoot = NewznabMockBuilder.generateResponse(0, 10, params.getApikey(), false, Collections.emptyList()); Random random = new Random(); for (NewznabXmlItem item : rssRoot.getRssChannel().getItems()) { item.setNewznabAttributes(new ArrayList<>()); item.getTorznabAttributes().add(new NewznabAttribute("seeders", String.valueOf(random.nextInt(30000)))); item.getTorznabAttributes().add(new NewznabAttribute("peers", String.valueOf(random.nextInt(30000)))); if (random.nextInt(5) > 3) { item.getTorznabAttributes().add(new NewznabAttribute("grabs", String.valueOf(random.nextInt(30000)))); } item.setCategory("5000"); item.setGrabs(null); } return new ResponseEntity<Object>(rssRoot, HttpStatus.OK); }
@Override protected void completeIndexerSearchResult(Xml response, IndexerSearchResult indexerSearchResult, AcceptorResult acceptorResult, SearchRequest searchRequest, int offset, Integer limit) { NewznabXmlChannel rssChannel = ((NewznabXmlRoot) response).getRssChannel(); super.completeIndexerSearchResult(response, indexerSearchResult, acceptorResult, searchRequest, offset, limit); indexerSearchResult.setTotalResultsKnown(true); indexerSearchResult.setHasMoreResults(false); indexerSearchResult.setOffset(0); indexerSearchResult.setTotalResults(rssChannel.getItems().size()); indexerSearchResult.setLimit(10000); }
@Override protected List<SearchResultItem> getSearchResultItems(NewznabXmlRoot rssRoot) { if (rssRoot.getRssChannel().getItems() == null || rssRoot.getRssChannel().getItems().isEmpty()) { debug("No results found"); return Collections.emptyList(); for (NewznabXmlItem rssItem : rssRoot.getRssChannel().getItems()) { SearchResultItem item = new SearchResultItem(); item.setPubDate(rssItem.getPubDate());
rssRoot = NewznabMockBuilder.generateResponse(mockRequest); rssRoot.getRssChannel().getNewznabResponse().setTotal(1); rssRoot.getRssChannel().getItems().get(0).getEnclosure().setLength(100000L); rssRoot.getRssChannel().getItems().get(0).getNewznabAttributes().clear(); } else if (uri.toString().contains("duplicatesandtitlegroups")) { rssRoot.getRssChannel().getItems().get(0).getEnclosure().setLength(100000L); rssRoot.getRssChannel().getItems().get(0).getNewznabAttributes().clear(); rssRoot.getRssChannel().getItems().get(0).getTorznabAttributes().clear(); rssRoot.getRssChannel().getItems().get(0).getNewznabAttributes().add(new NewznabAttribute("grabs", "100")); rssRoot3.getRssChannel().getItems().get(0).getEnclosure().setLength(200000L); rssRoot3.getRssChannel().getItems().get(0).getNewznabAttributes().clear(); rssRoot3.getRssChannel().getItems().get(0).getTorznabAttributes().clear(); rssRoot3.getRssChannel().getItems().get(0).getNewznabAttributes().add(new NewznabAttribute("grabs", "2000")); rssRoot3.getRssChannel().getItems().get(0).setLink("anotherlink"); //Otherwise it will result in a unique key exception rssRoot.getRssChannel().getItems().add(rssRoot3.getRssChannel().getItems().get(0)); rssRoot.getRssChannel().getItems().add(rssRoot2.getRssChannel().getItems().get(0)); rssRoot = NewznabMockBuilder.generateResponse(mockRequest); rssRoot.getRssChannel().getNewznabResponse().setTotal(10); for (NewznabXmlItem rssItem : rssRoot.getRssChannel().getItems()) { rssItem.getEnclosure().setLength(100000L); rssItem.getNewznabAttributes().clear(); rssRoot.getRssChannel().getItems().get(0).setTitle("a a"); rssRoot.getRssChannel().getItems().get(1).setTitle("ab"); rssRoot.getRssChannel().getItems().get(2).setTitle("a.c");
if (!rssRoot.getRssChannel().getItems().isEmpty()) { if (indexerConfig.getSearchModuleType() == SearchModuleType.NEWZNAB && isTorznabResult(rssRoot)) { logger.error("Indexer added as newznab but returns torznab results");
if (rssRoot.getRssChannel().getItems().isEmpty()) { logger.info("Indexer {} probably doesn't support the ID type {}. It returned no results.", request.indexerConfig.getName(), request.getKey()); eventPublisher.publishEvent(new CheckerEvent(indexerConfig.getName(), "Probably doesn't support " + request.getKey())); return new SingleCheckCapsResponse(request.getKey(), false, rssRoot.getRssChannel().getGenerator()); long countCorrectResults = rssRoot.getRssChannel().getItems().stream().filter(x -> request.getTitleExpectedToContain().stream().anyMatch(y -> x.getTitle().toLowerCase().contains(y.toLowerCase()))).count(); float percentCorrect = (100 * countCorrectResults) / rssRoot.getRssChannel().getItems().size(); boolean supported = percentCorrect >= ID_THRESHOLD_PERCENT; if (supported) {
return NfoResult.withoutNfo(); return NfoResult.withNfo(rssRoot.getRssChannel().getItems().get(0).getDescription()); } catch (IOException | IndexerAccessException e) { error("Error while getting NFO: " + e.getMessage());
NewznabXmlItem item = new NewznabXmlItem(); item.setDescription("NFO for NZB with ID " + params.getId()); rssRoot.getRssChannel().getItems().add(item); return ResponseEntity.ok(rssRoot); NewznabMockRequest mockRequest = NewznabMockRequest.builder().numberOfResults(10).titleBase("actualduplicates").offset(params.getOffset()).titleWords(Collections.emptyList()).total(10).build(); NewznabXmlRoot rssRoot = NewznabMockBuilder.generateResponse(mockRequest); rssRoot.getRssChannel().getItems().forEach(x -> x.setTitle(rssRoot.getRssChannel().getItems().get(0).getTitle())); rssRoot.getRssChannel().getItems().forEach(x -> x.setLink(rssRoot.getRssChannel().getItems().get(0).getLink())); rssRoot.getRssChannel().getItems().forEach(x -> x.setRssGuid(rssRoot.getRssChannel().getItems().get(0).getRssGuid())); rssRoot.getRssChannel().getItems().forEach(x -> x.setNewznabAttributes(rssRoot.getRssChannel().getItems().get(0).getNewznabAttributes())); return new ResponseEntity<Object>(rssRoot, HttpStatus.OK); NewznabXmlRoot rssRoot = NewznabMockBuilder.generateResponse(mockRequest); rssRoot.getRssChannel().getNewznabResponse().setTotal(1); rssRoot.getRssChannel().getItems().forEach(x -> x.setTitle("titlegroup")); return new ResponseEntity<Object>(rssRoot, HttpStatus.OK);
@Override protected List<SearchResultItem> getSearchResultItems(NewznabXmlRoot rssRoot) throws IndexerParsingException { List<SearchResultItem> items = new ArrayList<>(); for (NewznabXmlItem rssItem : rssRoot.getRssChannel().getItems()) { SearchResultItem item = new SearchResultItem(); item.setOriginalCategory("Anime"); item.setTitle(rssItem.getTitle()); item.setLink(rssItem.getLink()); item.setIndexerGuid(rssItem.getRssGuid().getGuid()); item.setSize(rssItem.getEnclosure().getLength()); item.setPubDate(rssItem.getPubDate()); item.setIndexerScore(config.getScore().orElse(0)); item.setHasNfo(HasNfo.NO); item.setAgePrecise(true); item.setCategory(categoryProvider.getByInternalName("Anime")); item.setIndexer(this); item.setDownloadType(DownloadType.NZB); items.add(item); } return items; }