public NewznabXmlItem build() { NewznabXmlItem rssItem = new NewznabXmlItem(); rssItem.setTitle(title); rssItem.setLink(link); rssItem.setPubDate(pubDate); rssItem.setDescription(description); rssItem.setComments(comments); rssItem.setCategory(category); rssItem.setGrabs(grabs); rssItem.setNewznabAttributes(newznabAttributes); rssItem.setTorznabAttributes(torznabAttributes); rssItem.setRssGuid(new NewznabXmlGuid(title + "-guid", false)); } else { rssItem.setRssGuid(rssGuid); rssItem.setEnclosure(new NewznabXmlEnclosure(link, size, "application/x-nzb")); } else { rssItem.setEnclosure(enclosure);
protected List<Integer> tryAndGetCategoryAsNumber(NewznabXmlItem item) { Set<Integer> foundCategories = new HashSet<>(); if (item.getCategory() != null) { try { foundCategories.add(Integer.parseInt(item.getCategory())); } catch (NumberFormatException e) { //NOP } } foundCategories.addAll(item.getNewznabAttributes().stream().filter(x -> x.getName().equals("category")).map(x -> Integer.valueOf(x.getValue())).collect(Collectors.toList())); foundCategories.addAll(item.getTorznabAttributes().stream().filter(x -> x.getName().equals("category")).map(x -> Integer.valueOf(x.getValue())).collect(Collectors.toList())); return new ArrayList<>(foundCategories); }
@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); }
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); 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);
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().getNewznabResponse().setTotal(10); for (NewznabXmlItem rssItem : rssRoot.getRssChannel().getItems()) { rssItem.getEnclosure().setLength(100000L); rssItem.getNewznabAttributes().clear(); rssItem.setPubDate(Instant.now()); rssItem.setDescription("Indexer: " + getName() + ", title:" + rssItem.getTitle()); rssRoot.getRssChannel().getItems().get(0).setTitle("a a"); rssRoot.getRssChannel().getItems().get(1).setTitle("ab"); rssRoot.getRssChannel().getItems().get(2).setTitle("a.c");
searchResultItem.setLink(link); if (item.getRssGuid().isPermaLink()) { searchResultItem.setDetails(item.getRssGuid().getGuid()); Matcher matcher = GUID_PATTERN.matcher(item.getRssGuid().getGuid()); if (matcher.matches()) { searchResultItem.setIndexerGuid(matcher.group(2)); } else { searchResultItem.setIndexerGuid(item.getRssGuid().getGuid()); searchResultItem.setIndexerGuid(item.getRssGuid().getGuid()); if (!Strings.isNullOrEmpty(item.getComments()) && Strings.isNullOrEmpty(searchResultItem.getDetails())) { searchResultItem.setDetails(item.getComments().replace("#comments", "")); searchResultItem.setTitle(cleanUpTitle(item.getTitle())); searchResultItem.setSize(item.getEnclosure().getLength()); searchResultItem.setPubDate(item.getPubDate()); searchResultItem.setIndexerScore(config.getScore().orElse(0)); searchResultItem.setGuid(SearchResultIdCalculator.calculateSearchResultId(searchResultItem)); searchResultItem.setAgePrecise(true); searchResultItem.setDescription(item.getDescription()); searchResultItem.setDownloadType(DownloadType.NZB); searchResultItem.setCommentsLink(item.getComments()); searchResultItem.setOriginalCategory(item.getCategory()); //May be overwritten by mapping in attributes parseAttributes(item, searchResultItem);
@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; }
for (NewznabXmlItem rssItem : rssRoot.getRssChannel().getItems()) { SearchResultItem item = new SearchResultItem(); item.setPubDate(rssItem.getPubDate()); String nzbIndexLink = rssItem.getLink(); item.setTitle(nzbIndexLink.substring(nzbIndexLink.lastIndexOf('/') + 1, nzbIndexLink.length() - 4)); //Use the NZB name as title because it's already somewhat cleaned up item.setAgePrecise(true); item.setGroup(rssItem.getCategory().replace("a.b", "alt.binaries")); item.setLink(rssItem.getEnclosure().getUrl()); item.setSize(rssItem.getEnclosure().getLength()); Matcher matcher = GUID_PATTERN.matcher(nzbIndexLink); boolean found = matcher.find(); item.setOriginalCategory("N/A"); item.setIndexerScore(config.getScore().orElse(0)); item.setHasNfo(rssItem.getDescription().contains("1 NFO") ? HasNfo.YES : HasNfo.NO); item.setIndexer(this); item.setDownloadType(DownloadType.NZB);
protected SearchResultItem createSearchResultItem(NewznabXmlItem item) throws NzbHydraException { item.getRssGuid().setPermaLink(true); //Not set in RSS but actually always true SearchResultItem searchResultItem = super.createSearchResultItem(item); searchResultItem.setGrabs(item.getGrabs()); searchResultItem.setIndexerGuid(item.getRssGuid().getGuid()); for (NewznabAttribute attribute : item.getTorznabAttributes()) { searchResultItem.getAttributes().put(attribute.getName(), attribute.getValue()); switch (attribute.getName()) { searchResultItem.setSize(item.getSize()); if (item.getSize() != null && item.getTorznabAttributes().stream().noneMatch(x -> x.getName().equals("size"))) { searchResultItem.getAttributes().put("size", String.valueOf(item.getSize()));
protected void parseAttributes(NewznabXmlItem item, SearchResultItem searchResultItem) { Map<String, String> attributes = item.getNewznabAttributes().stream().collect(Collectors.toMap(NewznabAttribute::getName, NewznabAttribute::getValue, (a, b) -> b)); List<Integer> newznabCategories = item.getNewznabAttributes().stream().filter(x -> x.getName().equals("category") && !"None".equals(x.getValue()) && !Strings.isNullOrEmpty(x.getValue())).map(newznabAttribute -> Integer.parseInt(newznabAttribute.getValue())).collect(Collectors.toList()); searchResultItem.setAttributes(attributes); if (!searchResultItem.getGroup().isPresent() && !Strings.isNullOrEmpty(item.getDescription()) && item.getDescription().contains("Group:")) { Matcher matcher = GROUP_PATTERN.matcher(item.getDescription()); if (matcher.matches() && !Objects.equals(matcher.group(1), "not available")) { searchResultItem.setGroup(matcher.group(1));
for (int i = startCount; i <= endCount; i++) { NewznabXmlItem item = new NewznabXmlItem(); item.setDescription("Some longer itemDescription that whatever" + i); item.setTitle(itemTitleBase + i); item.setPubDate(Instant.now().minus(i * 1000, ChronoUnit.HOURS)); item.setEnclosure(new NewznabXmlEnclosure("enclosureUrl", 5L, "application/x-nzb")); item.setComments("http://www.comments.com/" + i); item.setLink("http://www.link.com/" + i); item.setCategory("category"); item.setRssGuid(new NewznabXmlGuid("http://www."+itemTitleBase +".com/" + i, true)); attributes.add(new NewznabAttribute("poster", "poster")); attributes.add(new NewznabAttribute("group", "group")); item.setNewznabAttributes(attributes);
for (int i = request.getOffset()+1; i <= request.getOffset() + request.getNumberOfResults(); i++) { NewznabXmlItem item = new NewznabXmlItem(); String size = String.valueOf(Math.abs(random.nextInt(999999999))); String poster = "poster"; item.setDescription("Some longer itemDescription that whatever" + i); item.setTitle(title); item.setPubDate(pubDate); String guid = "http://127.0.0.1:5080/nzb/" + request.getTitleBase() + i; item.setEnclosure(new NewznabXmlEnclosure(guid, Long.valueOf(size), "application/x-nzb")); item.setComments("http://127.0.0.1:5080/comments/" + i); item.setLink(guid); item.setCategory("TV > HD"); item.setRssGuid(new NewznabXmlGuid(guid, true)); attributes.add(new NewznabAttribute("nfo", String.valueOf(random.nextInt(2)))); item.setNewznabAttributes(attributes); item.setGrabs(i * 2); List<NewznabAttribute> torznabAttributes = new ArrayList<>(); torznabAttributes.add(new NewznabAttribute("seeders", String.valueOf(i))); torznabAttributes.add(new NewznabAttribute("peers", String.valueOf(i * 2))); torznabAttributes.add(new NewznabAttribute("size", size)); item.setTorznabAttributes(torznabAttributes);
NewznabXmlItem buildRssItem(SearchResultItem searchResultItem, SearchRequest searchRequest) { NewznabXmlItem rssItem = new NewznabXmlItem(); boolean isNzb = searchRequest.getDownloadType() == org.nzbhydra.searching.dtoseventsenums.DownloadType.NZB; String link = nzbHandler.getDownloadLink(searchResultItem.getSearchResultId(), false, isNzb ? DownloadType.NZB : DownloadType.TORRENT); rssItem.setLink(link); rssItem.setTitle(searchResultItem.getTitle()); rssItem.setRssGuid(new NewznabXmlGuid(String.valueOf(searchResultItem.getGuid()), false)); rssItem.setSize(searchResultItem.getSize()); if (searchResultItem.getPubDate() != null) { rssItem.setPubDate(searchResultItem.getPubDate()); } else { rssItem.setPubDate(searchResultItem.getBestDate()); //Contain usenet date because results with neither should've been String resultType; if (isNzb) { rssItem.setNewznabAttributes(newznabAttributes); resultType = APPLICATION_TYPE_NZB; } else { rssItem.setTorznabAttributes(newznabAttributes); resultType = APPLICATION_TYPE_TORRENT; rssItem.setEnclosure(new NewznabXmlEnclosure(link, searchResultItem.getSize(), resultType)); rssItem.setComments(searchResultItem.getCommentsLink()); rssItem.setDescription(searchResultItem.getDescription()); rssItem.setCategory(configProvider.getBaseConfig().getSearching().isUseOriginalCategories() ? searchResultItem.getOriginalCategory() : searchResultItem.getCategory().getName()); return rssItem;