Add filter for TorrentHound results page.
[rhynodge.git] / src / main / java / net / pterodactylus / rhynodge / filters / torrents / TorrentHoundFilter.java
1 package net.pterodactylus.rhynodge.filters.torrents;
2
3 import java.util.List;
4 import java.util.concurrent.atomic.AtomicBoolean;
5 import java.util.stream.Collectors;
6
7 import net.pterodactylus.rhynodge.filters.TorrentSiteFilter;
8
9 import org.jsoup.nodes.Document;
10 import org.jsoup.nodes.Element;
11 import org.jsoup.nodes.Node;
12 import org.jsoup.parser.Tag;
13 import org.jsoup.select.Elements;
14
15 /**
16  * {@link TorrentSiteFilter} implementation that can parse TorrentHound
17  * results.
18  *
19  * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
20  */
21 public class TorrentHoundFilter extends TorrentSiteFilter {
22
23         @Override
24         protected Elements getDataRows(Document document) {
25                 return document.select("table.searchtable:gt(0) tr:gt(0)");
26         }
27
28         @Override
29         protected String extractName(Element dataRow) {
30                 return dataRow.select("td > a").stream().map(element -> {
31                         AtomicBoolean foundBr = new AtomicBoolean(false);
32                         List<Node> nodes = element.childNodes().stream().filter(textNode -> {
33                                 if (textNode.nodeName().equals("br")) {
34                                         foundBr.set(true);
35                                 }
36                                 return !foundBr.get();
37                         }).collect(Collectors.toList());
38                         Element e = new Element(Tag.valueOf("span"), "");
39                         nodes.stream().forEach(node -> e.appendChild(node));
40                         return e.text();
41                 }).findFirst().get();
42         }
43
44         @Override
45         protected String extractSize(Element dataRow) {
46                 return dataRow.select("span.size").text();
47         }
48
49         @Override
50         protected String extractMagnetUri(Element dataRow) {
51                 return dataRow.select("div.sfloat a[title=Magnet download]").attr("href");
52         }
53
54         @Override
55         protected String extractDownloadUri(Element dataRow) {
56                 return dataRow.select("div.sfloat a[title=.torrent download]").attr("href");
57         }
58
59         @Override
60         protected int extractFileCount(Element dataRow) {
61                 return 0;
62         }
63
64         @Override
65         protected int extractSeedCount(Element dataRow) {
66                 return Integer.valueOf(dataRow.select("span.seeds").text().replaceAll("[^0-9]", ""));
67         }
68
69         @Override
70         protected int extractLeechCount(Element dataRow) {
71                 return Integer.valueOf(dataRow.select("span.leeches").text().replaceAll("[^0-9]", ""));
72         }
73
74 }