public static NewznabXmlRoot getRssRoot(List<NewznabXmlItem> items, int offset, int total) { NewznabXmlRoot rssRoot = new NewznabXmlRoot(); rssRoot.setVersion("2.0"); NewznabXmlChannel channel = new NewznabXmlChannel(); channel.setTitle("channelTitle"); channel.setDescription("channelDescription"); channel.setLanguage("en-gb"); channel.setWebMaster("webmaster@master.com"); channel.setLink("http://127.0.0.1:5080"); channel.setNewznabResponse(new NewznabXmlResponse(offset, total)); channel.setItems(items); rssRoot.setRssChannel(channel); return rssRoot; }
@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 Xml getAndStoreResultToDatabase(URI uri, IndexerApiAccessType apiAccessType) throws IndexerAccessException { NewznabXmlRoot rssRoot = new NewznabXmlRoot(); if (uri.toString().contains("oneduplicate")) { NewznabMockRequest mockRequest = NewznabMockRequest.builder().numberOfResults(1).titleBase("oneresult").titleWords(Collections.emptyList()).total(1).build(); 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.getRssChannel().getNewznabResponse().setTotal(3); NewznabMockRequest mockRequest = NewznabMockRequest.builder().numberOfResults(10).titleBase("duplicates").titleWords(Collections.emptyList()).total(10).build(); rssRoot = NewznabMockBuilder.generateResponse(mockRequest); rssRoot.getRssChannel().getNewznabResponse().setTotal(10); for (NewznabXmlItem rssItem : rssRoot.getRssChannel().getItems()) {
if (!(response instanceof CapsXmlRoot)) { if (response instanceof NewznabXmlRoot) { NewznabXmlError error = ((NewznabXmlRoot) response).getError(); if (error != null) { throw new IndexerAccessException("Indexer reported error during caps check: " + error);
NewznabXmlRoot getRssRoot(List<SearchResultItem> searchResultItems, Integer offset, int total, SearchRequest searchRequest) { NewznabXmlRoot rssRoot = new NewznabXmlRoot(); NewznabXmlChannel rssChannel = new NewznabXmlChannel(); rssChannel.setTitle("NZBHydra 2"); rssChannel.setLink("https://www.github.com/theotherp/nzbhydra2"); rssChannel.setWebMaster("theotherp@gmx.de"); if (searchRequest.getDownloadType() == org.nzbhydra.searching.dtoseventsenums.DownloadType.NZB) { rssChannel.setNewznabResponse(new NewznabXmlResponse(offset == null ? 0 : offset, total)); } rssChannel.setGenerator("NZBHydra2"); rssRoot.setRssChannel(rssChannel); List<NewznabXmlItem> items = new ArrayList<>(); for (SearchResultItem searchResultItem : searchResultItems) { NewznabXmlItem rssItem = buildRssItem(searchResultItem, searchRequest); items.add(rssItem); } rssChannel.setItems(items); return rssRoot; }
NewznabXmlRoot rssRoot = new NewznabXmlRoot(); rssRoot.getRssChannel().setNewznabResponse(new NewznabXmlResponse(0, 1)); NewznabXmlItem item = new NewznabXmlItem(); item.setDescription("NFO for NZB with ID " + params.getId()); rssRoot.getRssChannel().getItems().add(item); return ResponseEntity.ok(rssRoot); NewznabXmlRoot rssRoot = new NewznabXmlRoot(); rssRoot.getRssChannel().setNewznabResponse(new NewznabXmlResponse(0, 0)); if (params.getOffset() >= 40) { return new ResponseEntity<Object>(rssRoot, HttpStatus.OK); rssRoot.getRssChannel().getNewznabResponse().setTotal(40); return new ResponseEntity<Object>(rssRoot, HttpStatus.OK); 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); rssRoot.getRssChannel().getNewznabResponse().setTotal(100); return new ResponseEntity<Object>(rssRoot, HttpStatus.OK); rssRoot.getRssChannel().getNewznabResponse().setTotal(100); return new ResponseEntity<Object>(rssRoot, HttpStatus.OK);
public NewznabXmlRoot getTestResult(int startCount, int endCount, String itemTitleBase, Integer offset, Integer total) { NewznabXmlRoot rssRoot = new NewznabXmlRoot(); rssRoot.setVersion("2.0"); NewznabXmlChannel channel = new NewznabXmlChannel(); channel.setTitle("channelTitle"); rssRoot.setRssChannel(channel);
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); }
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) { logger.info("Indexer {} probably supports the ID type {}. {}% of results were correct.", request.indexerConfig.getName(), request.getKey(), percentCorrect); eventPublisher.publishEvent(new CheckerEvent(indexerConfig.getName(), "Probably supports " + request.getKey())); return new SingleCheckCapsResponse(request.getKey(), true, rssRoot.getRssChannel().getGenerator()); } else { logger.info("Indexer {} probably doesn't support the ID type {}. {}% of results were correct.", request.indexerConfig.getName(), request.getKey(), percentCorrect); eventPublisher.publishEvent(new CheckerEvent(indexerConfig.getName(), "Probably doesn't support " + request.getKey())); return new SingleCheckCapsResponse(request.getKey(), false, rssRoot.getRssChannel().getGenerator());
@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());
if (rssRoot.getRssChannel().getNewznabResponse() == null || rssRoot.getRssChannel().getNewznabResponse().getTotal() == 0) { return NfoResult.withoutNfo(); return NfoResult.withNfo(rssRoot.getRssChannel().getItems().get(0).getDescription()); } catch (IOException | IndexerAccessException e) { error("Error while getting NFO: " + e.getMessage());
if (!rssRoot.getRssChannel().getItems().isEmpty()) { if (indexerConfig.getSearchModuleType() == SearchModuleType.NEWZNAB && isTorznabResult(rssRoot)) { logger.error("Indexer added as newznab but returns torznab results");
@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; }
protected void completeIndexerSearchResult(Xml response, IndexerSearchResult indexerSearchResult, AcceptorResult acceptorResult, SearchRequest searchRequest, int offset, Integer limit) { NewznabXmlResponse newznabResponse = ((NewznabXmlRoot) response).getRssChannel().getNewznabResponse(); if (newznabResponse != null) { indexerSearchResult.setTotalResultsKnown(true); if (newznabResponse.getTotal() != null) { //Animetosho doesn't provide a total number of results indexerSearchResult.setTotalResults(newznabResponse.getTotal()); indexerSearchResult.setHasMoreResults(newznabResponse.getTotal() > newznabResponse.getOffset() + indexerSearchResult.getSearchResultItems().size() + acceptorResult.getNumberOfRejectedResults()); } else { indexerSearchResult.setTotalResults(indexerSearchResult.getSearchResultItems().size()); indexerSearchResult.setHasMoreResults(false); } indexerSearchResult.setOffset(newznabResponse.getOffset()); indexerSearchResult.setLimit(100); } else { indexerSearchResult.setTotalResultsKnown(false); indexerSearchResult.setHasMoreResults(false); indexerSearchResult.setOffset(0); indexerSearchResult.setLimit(0); } }
protected void completeIndexerSearchResult(Xml response, IndexerSearchResult indexerSearchResult, AcceptorResult acceptorResult, SearchRequest searchRequest, int offset, Integer limit) { NewznabXmlResponse newznabResponse = ((NewznabXmlRoot) response).getRssChannel().getNewznabResponse(); //DogNZB does not return a reliable total number. It's always 100 if there are more results, less if it's the last page indexerSearchResult.setTotalResultsKnown(false); if (newznabResponse != null) { if (newznabResponse.getTotal() == 100) { indexerSearchResult.setHasMoreResults(true); indexerSearchResult.setTotalResults(100); } else { indexerSearchResult.setTotalResultsKnown(true); indexerSearchResult.setHasMoreResults(false); indexerSearchResult.setTotalResults(searchRequest.getOffset().orElse(0) + newznabResponse.getTotal()); } indexerSearchResult.setOffset(newznabResponse.getOffset()); indexerSearchResult.setLimit(100); } else { indexerSearchResult.setTotalResults(0); indexerSearchResult.setHasMoreResults(false); indexerSearchResult.setOffset(0); indexerSearchResult.setLimit(0); } }