use of com.biglybt.pif.utils.xml.simpleparser.SimpleXMLParserDocumentNode in project BiglyBT by BiglySoftware.
the class TOTorrentXMLDeserialiser method decodeInfo.
protected void decodeInfo(SimpleXMLParserDocumentNode doc, TOTorrentImpl torrent) throws TOTorrentException {
SimpleXMLParserDocumentNode[] kids = doc.getChildren();
byte[] torrent_name = null;
long torrent_length = 0;
SimpleXMLParserDocumentNode[] file_nodes = null;
for (int i = 0; i < kids.length; i++) {
SimpleXMLParserDocumentNode kid = kids[i];
String name = kid.getName();
if (name.equalsIgnoreCase("PIECE_LENGTH")) {
torrent.setPieceLength(readGenericLong(kid).longValue());
} else if (name.equalsIgnoreCase("LENGTH")) {
torrent.setSimpleTorrent(true);
torrent_length = readGenericLong(kid).longValue();
} else if (name.equalsIgnoreCase("NAME")) {
torrent.setName(readLocalisableString(kid));
} else if (name.equalsIgnoreCase("FILES")) {
torrent.setSimpleTorrent(false);
file_nodes = kid.getChildren();
} else if (name.equalsIgnoreCase("PIECES")) {
SimpleXMLParserDocumentNode[] piece_nodes = kid.getChildren();
byte[][] pieces = new byte[piece_nodes.length][];
for (int j = 0; j < pieces.length; j++) {
pieces[j] = readGenericBytes(piece_nodes[j]);
}
torrent.setPieces(pieces);
} else {
mapEntry entry = readGenericMapEntry(kid);
torrent.addAdditionalInfoProperty(entry.name, entry.value);
}
}
if (torrent.isSimpleTorrent()) {
torrent.setFiles(new TOTorrentFileImpl[] { new TOTorrentFileImpl(torrent, 0, 0, torrent_length, new byte[][] { torrent.getName() }) });
} else {
if (file_nodes == null) {
throw (new TOTorrentException("FILES element missing", TOTorrentException.RT_DECODE_FAILS));
}
TOTorrentFileImpl[] files = new TOTorrentFileImpl[file_nodes.length];
long offset = 0;
for (int j = 0; j < files.length; j++) {
SimpleXMLParserDocumentNode file_node = file_nodes[j];
SimpleXMLParserDocumentNode[] file_entries = file_node.getChildren();
long file_length = 0;
boolean length_entry_found = false;
byte[][] path_comps = null;
Vector additional_props = new Vector();
for (int k = 0; k < file_entries.length; k++) {
SimpleXMLParserDocumentNode file_entry = file_entries[k];
String entry_name = file_entry.getName();
if (entry_name.equalsIgnoreCase("LENGTH")) {
file_length = readGenericLong(file_entry).longValue();
length_entry_found = true;
} else if (entry_name.equalsIgnoreCase("PATH")) {
SimpleXMLParserDocumentNode[] path_nodes = file_entry.getChildren();
path_comps = new byte[path_nodes.length][];
for (int n = 0; n < path_nodes.length; n++) {
path_comps[n] = readLocalisableString(path_nodes[n]);
}
} else {
additional_props.addElement(readGenericMapEntry(file_entry));
}
}
if ((!length_entry_found) || path_comps == null) {
throw (new TOTorrentException("FILE element invalid (file length = " + file_length + ")", TOTorrentException.RT_DECODE_FAILS));
}
files[j] = new TOTorrentFileImpl(torrent, j, offset, file_length, path_comps);
offset += file_length;
for (int k = 0; k < additional_props.size(); k++) {
mapEntry entry = (mapEntry) additional_props.elementAt(k);
files[j].setAdditionalProperty(entry.name, entry.value);
}
}
torrent.setFiles(files);
}
}
use of com.biglybt.pif.utils.xml.simpleparser.SimpleXMLParserDocumentNode in project BiglyBT by BiglySoftware.
the class UPNPMSContainerImpl method populate.
private void populate() throws UPnPMSException {
synchronized (this) {
if (children == null) {
children = new ArrayList<>();
List<SimpleXMLParserDocumentNode> results = browser.getContainerContents(id);
for (SimpleXMLParserDocumentNode result : results) {
// result.print();
SimpleXMLParserDocumentNode[] kids = result.getChildren();
for (SimpleXMLParserDocumentNode kid : kids) {
String name = kid.getName();
if (name.equalsIgnoreCase("container")) {
String id = kid.getAttribute("id").getValue();
String title = kid.getChild("title").getValue();
children.add(new UPNPMSContainerImpl(browser, id, title));
} else if (name.equalsIgnoreCase("item")) {
String id = kid.getAttribute("id").getValue();
String title = kid.getChild("title").getValue();
String cla = kid.getChild("class").getValue();
String item_class;
if (cla.contains(".imageItem")) {
item_class = UPNPMSItem.IC_IMAGE;
} else if (cla.contains(".audioItem")) {
item_class = UPNPMSItem.IC_AUDIO;
} else if (cla.contains(".videoItem")) {
item_class = UPNPMSItem.IC_VIDEO;
} else {
item_class = UPNPMSItem.IC_OTHER;
}
URL url = null;
long size = 0;
SimpleXMLParserDocumentNode[] sub = kid.getChildren();
for (SimpleXMLParserDocumentNode x : sub) {
if (x.getName().equalsIgnoreCase("res")) {
SimpleXMLParserDocumentAttribute a_size = x.getAttribute("size");
long this_size = 0;
if (a_size != null) {
try {
this_size = Long.parseLong(a_size.getValue().trim());
} catch (Throwable e) {
}
}
SimpleXMLParserDocumentAttribute pi = x.getAttribute("protocolInfo");
if (pi != null) {
String pi_str = pi.getValue().trim();
if (pi_str.toLowerCase().startsWith("http-get")) {
try {
if (size == 0 || this_size > size) {
url = new URL(x.getValue().trim());
size = this_size;
}
} catch (Throwable e) {
}
}
}
}
}
if (url != null) {
children.add(new UPNPMSItemImpl(id, title, item_class, size, url));
}
}
}
}
}
}
}
use of com.biglybt.pif.utils.xml.simpleparser.SimpleXMLParserDocumentNode in project BiglyBT by BiglySoftware.
the class RSSEngine method searchSupport.
@Override
protected Result[] searchSupport(SearchParameter[] searchParameters, Map searchContext, int desired_max_matches, int absolute_max_matches, String headers, ResultListener listener) throws SearchException {
debugStart();
boolean only_if_mod = !searchContext.containsKey(Engine.SC_FORCE_FULL);
pageDetails page_details = super.getWebPageContent(searchParameters, searchContext, headers, only_if_mod, new pageDetailsVerifier() {
@Override
public void verify(pageDetails details) throws SearchException {
try {
String page = details.getContent();
if (page != null && page.length() > 0) {
ByteArrayInputStream bais = new ByteArrayInputStream(page.getBytes("UTF-8"));
RSSFeed rssFeed = StaticUtilities.getRSSFeed(details.getInitialURL(), bais);
details.setVerifiedState(rssFeed);
}
} catch (Throwable e) {
debugLog("failed: " + Debug.getNestedExceptionMessageAndStack(e));
if (e instanceof SearchException) {
throw ((SearchException) e);
}
throw (new SearchException("RSS matching failed", e));
}
}
});
String page = page_details.getContent();
if (listener != null) {
listener.contentReceived(this, page);
}
if (page == null || page.length() == 0) {
return (new Result[0]);
}
try {
RSSFeed rssFeed = (RSSFeed) page_details.getVerifiedState();
RSSChannel[] channels = rssFeed.getChannels();
List results = new ArrayList();
for (int i = 0; i < channels.length; i++) {
RSSChannel channel = channels[i];
SimpleXMLParserDocumentNode[] channel_kids = channel.getNode().getChildren();
int auto_dl_state = AUTO_DL_SUPPORTED_YES;
for (int j = 0; j < channel_kids.length; j++) {
SimpleXMLParserDocumentNode child = channel_kids[j];
String lc_full_child_name = child.getFullName().toLowerCase();
if (lc_full_child_name.equals("vuze:auto_dl_enabled")) {
if (!child.getValue().equalsIgnoreCase("true")) {
auto_dl_state = AUTO_DL_SUPPORTED_NO;
}
}
}
setLocalLong(LD_AUTO_DL_SUPPORTED, auto_dl_state);
RSSItem[] items = channel.getItems();
for (int j = 0; j < items.length; j++) {
RSSItem item = items[j];
WebResult result = new WebResult(this, getRootPage(), getBasePage(), getDateParser(), "");
result.setPublishedDate(item.getPublicationDate());
result.setNameFromHTML(item.getTitle());
URL cdp_link = item.getLink();
boolean cdp_set = false;
if (cdp_link != null) {
String link_url = cdp_link.toExternalForm();
String lc_url = link_url.toLowerCase(Locale.US);
if (lc_url.startsWith("http") || lc_url.startsWith("tor:http")) {
result.setCDPLink(link_url);
cdp_set = true;
}
}
String uid = item.getUID();
if (uid != null) {
result.setUID(uid);
if (!cdp_set) {
try {
String test_url = new URL(uid).toExternalForm();
if (test_url.toLowerCase().startsWith("http")) {
result.setCDPLink(test_url);
}
} catch (Throwable e) {
}
}
}
boolean got_seeds_peers = false;
int item_seeds = -1;
int item_peers = -1;
String item_hash = null;
String item_magnet = null;
String desc_size = null;
SimpleXMLParserDocumentNode node = item.getNode();
if (node != null) {
SimpleXMLParserDocumentNode[] children = node.getChildren();
boolean vuze_feed = false;
for (int k = 0; k < children.length; k++) {
SimpleXMLParserDocumentNode child = children[k];
String lc_full_child_name = child.getFullName().toLowerCase();
if (lc_full_child_name.startsWith("vuze:")) {
vuze_feed = true;
break;
}
}
for (int k = 0; k < children.length; k++) {
SimpleXMLParserDocumentNode child = children[k];
String lc_child_name = child.getName().toLowerCase();
String lc_full_child_name = child.getFullName().toLowerCase();
String value = child.getValue().trim();
if (lc_child_name.equals("enclosure")) {
SimpleXMLParserDocumentAttribute typeAtt = child.getAttribute("type");
if (typeAtt != null && typeAtt.getValue().equalsIgnoreCase("application/x-bittorrent")) {
SimpleXMLParserDocumentAttribute urlAtt = child.getAttribute("url");
if (urlAtt != null) {
result.setTorrentLink(urlAtt.getValue());
}
SimpleXMLParserDocumentAttribute lengthAtt = child.getAttribute("length");
if (lengthAtt != null) {
result.setSizeFromHTML(lengthAtt.getValue());
}
}
} else if (lc_child_name.equals("category")) {
result.setCategoryFromHTML(value);
} else if (lc_child_name.equals("comments")) {
result.setCommentsFromHTML(value);
} else if (lc_child_name.equals("link") || lc_child_name.equals("guid")) {
String lc_value = value.toLowerCase();
try {
URL url = new URL(value);
if (lc_value.endsWith(".torrent") || lc_value.startsWith("magnet:") || lc_value.startsWith("bc:") || lc_value.startsWith("bctp:") || lc_value.startsWith("dht:")) {
result.setTorrentLink(value);
} else if (lc_child_name.equals("link") && !vuze_feed) {
long test = getLocalLong(LD_LINK_IS_TORRENT, 0);
if (test == 1) {
result.setTorrentLink(value);
} else if (test == 0 || SystemTime.getCurrentTime() - test > 60 * 1000) {
if (linkIsToTorrent(url)) {
result.setTorrentLink(value);
setLocalLong(LD_LINK_IS_TORRENT, 1);
} else {
setLocalLong(LD_LINK_IS_TORRENT, SystemTime.getCurrentTime());
}
}
}
} catch (Throwable e) {
// see if this is an atom feed
// <link rel="alternate" type="application/x-bittorrent" href="http://asdasd/
SimpleXMLParserDocumentAttribute typeAtt = child.getAttribute("type");
if (typeAtt != null && typeAtt.getValue().equalsIgnoreCase("application/x-bittorrent")) {
SimpleXMLParserDocumentAttribute hrefAtt = child.getAttribute("href");
if (hrefAtt != null) {
String href = hrefAtt.getValue().trim();
try {
result.setTorrentLink(new URL(href).toExternalForm());
} catch (Throwable f) {
}
}
}
}
} else if (lc_child_name.equals("content") && rssFeed.isAtomFeed()) {
SimpleXMLParserDocumentAttribute srcAtt = child.getAttribute("src");
String src = srcAtt == null ? null : srcAtt.getValue();
if (src != null) {
boolean is_dl_link = false;
SimpleXMLParserDocumentAttribute typeAtt = child.getAttribute("type");
if (typeAtt != null && typeAtt.getValue().equalsIgnoreCase("application/x-bittorrent")) {
is_dl_link = true;
}
if (!is_dl_link) {
is_dl_link = src.toLowerCase().contains(".torrent");
}
if (is_dl_link) {
try {
new URL(src);
result.setTorrentLink(src);
} catch (Throwable e) {
}
}
}
} else if (lc_full_child_name.equals("vuze:size")) {
result.setSizeFromHTML(value);
} else if (lc_full_child_name.equals("vuze:seeds")) {
got_seeds_peers = true;
result.setNbSeedsFromHTML(value);
} else if (lc_full_child_name.equals("vuze:superseeds")) {
got_seeds_peers = true;
result.setNbSuperSeedsFromHTML(value);
} else if (lc_full_child_name.equals("vuze:peers")) {
got_seeds_peers = true;
result.setNbPeersFromHTML(value);
} else if (lc_full_child_name.equals("vuze:rank")) {
result.setRankFromHTML(value);
} else if (lc_full_child_name.equals("vuze:contenttype")) {
String type = value.toLowerCase();
if (type.startsWith("video")) {
type = Engine.CT_VIDEO;
} else if (type.startsWith("audio")) {
type = Engine.CT_AUDIO;
} else if (type.startsWith("games")) {
type = Engine.CT_GAME;
}
result.setContentType(type);
} else if (lc_full_child_name.equals("vuze:downloadurl")) {
result.setTorrentLink(value);
} else if (lc_full_child_name.equals("vuze:playurl")) {
result.setPlayLink(value);
} else if (lc_full_child_name.equals("vuze:drmkey")) {
result.setDrmKey(value);
} else if (lc_full_child_name.equals("vuze:assethash")) {
result.setHash(value);
} else if (lc_child_name.equals("seeds") || lc_child_name.equals("seeders")) {
try {
item_seeds = Integer.parseInt(value);
} catch (Throwable e) {
}
} else if (lc_child_name.equals("peers") || lc_child_name.equals("leechers")) {
try {
item_peers = Integer.parseInt(value);
} catch (Throwable e) {
}
} else if (lc_child_name.equals("infohash") || lc_child_name.equals("info_hash")) {
item_hash = value;
} else if (lc_child_name.equals("magneturi")) {
item_magnet = value;
}
}
}
if (!got_seeds_peers) {
if (item_peers >= 0 && item_seeds >= 0) {
result.setNbSeedsFromHTML(String.valueOf(item_seeds));
result.setNbPeersFromHTML(String.valueOf(item_peers));
got_seeds_peers = true;
}
}
if (!got_seeds_peers) {
try {
SimpleXMLParserDocumentNode desc_node = node.getChild("description");
if (desc_node != null) {
String desc = desc_node.getValue().trim();
// see if we can pull from description
desc = desc.replaceAll("\\(s\\)", "s");
desc = desc.replaceAll("seeders", "seeds");
Matcher m = seed_leecher_pat.matcher(desc);
while (m.find()) {
String num = m.group(1);
String type = m.group(2);
if (type.toLowerCase().charAt(0) == 's') {
result.setNbSeedsFromHTML(num);
} else {
result.setNbPeersFromHTML(num);
}
}
m = size_pat.matcher(desc);
if (m.find()) {
desc_size = m.group(1) + " " + m.group(2);
}
}
} catch (Throwable e) {
}
}
try {
SimpleXMLParserDocumentNode torrent_node = node.getChild("torrent");
if (torrent_node != null) {
if (result.getSize() <= 0) {
SimpleXMLParserDocumentNode n = torrent_node.getChild("contentLength");
if (n != null) {
try {
long l = Long.parseLong(n.getValue().trim());
result.setSizeFromHTML(l + " B");
} catch (Throwable e) {
}
}
}
String dlink = result.getDownloadLink();
if (dlink == null || dlink.length() == 0) {
SimpleXMLParserDocumentNode n = torrent_node.getChild("magnetURI");
if (n != null) {
dlink = n.getValue().trim();
result.setTorrentLink(dlink);
}
}
String hash = result.getHash();
if (hash == null || hash.length() == 0) {
SimpleXMLParserDocumentNode n = torrent_node.getChild("infoHash");
if (n != null) {
String h = n.getValue().trim();
result.setHash(h);
if (dlink == null || dlink.length() == 0) {
String uri = UrlUtils.normaliseMagnetURI(h);
if (uri != null) {
result.setTorrentLink(uri);
}
}
}
}
SimpleXMLParserDocumentNode trackers_node = torrent_node.getChild("trackers");
if (trackers_node != null && !got_seeds_peers) {
SimpleXMLParserDocumentNode[] groups = trackers_node.getChildren();
int max_total = -1;
int best_seeds = 0;
int best_leechers = 0;
for (SimpleXMLParserDocumentNode group : groups) {
SimpleXMLParserDocumentNode[] g_kids = group.getChildren();
for (SimpleXMLParserDocumentNode t : g_kids) {
if (t.getName().equalsIgnoreCase("tracker")) {
SimpleXMLParserDocumentAttribute a_seeds = t.getAttribute("seeds");
SimpleXMLParserDocumentAttribute a_leechers = t.getAttribute("peers");
int seeds = a_seeds == null ? -1 : Integer.parseInt(a_seeds.getValue().trim());
int leechers = a_leechers == null ? -1 : Integer.parseInt(a_leechers.getValue().trim());
int total = seeds + leechers;
if (total > max_total) {
max_total = total;
best_seeds = seeds;
best_leechers = leechers;
}
}
}
}
if (max_total >= 0) {
result.setNbSeedsFromHTML(String.valueOf(Math.max(0, best_seeds)));
result.setNbPeersFromHTML(String.valueOf(Math.max(0, best_leechers)));
}
}
}
} catch (Throwable e) {
e.printStackTrace();
}
if (result.getSize() <= 0) {
SimpleXMLParserDocumentNode n = node.getChild("size");
if (n != null) {
result.setSizeFromHTML(n.getValue().trim());
}
}
if (item_hash != null && result.getHash() == null) {
result.setHash(item_hash);
}
if (item_magnet != null) {
String existing = result.getTorrentLinkRaw();
if (existing == null || existing.length() == 0) {
result.setTorrentLink(item_magnet);
}
}
// if we still have no download link see if the magnet is in the title
String dlink = result.getDownloadLink();
if (dlink == null || dlink.length() == 0) {
String name = result.getName();
if (name != null) {
String magnet = UrlUtils.parseTextForMagnets(name);
if (magnet != null) {
result.setTorrentLink(magnet);
}
}
}
dlink = result.getDownloadLink();
if (dlink == null || dlink.length() == 0) {
// last ditch effort, sometimes the download link is the <link> so stuff it in and hope (could test download once I guess and then
// record the outcome if it is a torrent but, meh)
result.setTorrentLink(result.getCDPLink());
}
// some feeds have the cdp link as guid - grab this if cdp link is blank or same as dl link
String latest_cdp_link = result.getCDPLink();
String latest_torrent_link = result.getTorrentLink();
if (latest_cdp_link == null || (latest_cdp_link.length() > 0 && latest_cdp_link.equals(latest_torrent_link))) {
try {
String test_url = new URL(uid).toExternalForm();
if (test_url.toLowerCase().startsWith("http")) {
result.setCDPLink(test_url);
}
} catch (Throwable e) {
}
}
if (result.getSize() <= 0) {
if (desc_size != null) {
result.setSizeFromHTML(desc_size);
}
}
if (result.getHash() == null) {
if (dlink != null) {
String mag = UrlUtils.parseTextForMagnets(dlink);
if (mag == null) {
String tlink = result.getTorrentLinkRaw();
if (tlink != null) {
mag = UrlUtils.parseTextForMagnets(tlink);
}
}
if (mag != null) {
byte[] hash = UrlUtils.getHashFromMagnetURI(mag);
if (hash != null) {
result.setHash(ByteFormatter.encodeString(hash));
}
}
}
}
results.add(result);
if (absolute_max_matches >= 0 && results.size() == absolute_max_matches) {
break;
}
}
}
Result[] res = (Result[]) results.toArray(new Result[results.size()]);
debugLog("success: found " + res.length + " results");
return (res);
} catch (Throwable e) {
debugLog("failed: " + Debug.getNestedExceptionMessageAndStack(e));
if (e instanceof SearchException) {
throw ((SearchException) e);
}
throw (new SearchException("RSS matching failed", e));
}
}
use of com.biglybt.pif.utils.xml.simpleparser.SimpleXMLParserDocumentNode in project BiglyBT by BiglySoftware.
the class TOTorrentXMLDeserialiser method readGenericMapEntry.
protected mapEntry readGenericMapEntry(SimpleXMLParserDocumentNode node) throws TOTorrentException {
if (!node.getName().equalsIgnoreCase("KEY")) {
throw (new TOTorrentException("Additional property invalid, must be KEY node", TOTorrentException.RT_DECODE_FAILS));
}
String name = node.getAttribute("name").getValue();
SimpleXMLParserDocumentNode[] kids = node.getChildren();
if (kids.length != 1) {
throw (new TOTorrentException("Additional property invalid, KEY must have one child", TOTorrentException.RT_DECODE_FAILS));
}
String type = kids[0].getName();
Object value = readGenericValue(kids[0]);
return (new mapEntry(name, value));
}
use of com.biglybt.pif.utils.xml.simpleparser.SimpleXMLParserDocumentNode in project BiglyBT by BiglySoftware.
the class UPnPStateVariableImpl method getValue.
@Override
public String getValue() throws UPnPException {
try {
String soap_action = "urn:schemas-upnp-org:control-1-0#QueryStateVariable";
String request = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" + "<s:Body>";
request += "<u:QueryStateVariable xmlns:u=\"urn:schemas-upnp-org:control-1-0\">" + "<u:varName>" + name + "</u:varName>" + "</u:QueryStateVariable>";
request += "</s:Body>" + "</s:Envelope>";
SimpleXMLParserDocument resp_doc = ((UPnPDeviceImpl) service.getDevice()).getUPnP().performSOAPRequest(service, soap_action, request);
SimpleXMLParserDocumentNode body = resp_doc.getChild("Body");
SimpleXMLParserDocumentNode fault = body.getChild("Fault");
if (fault != null) {
throw (new UPnPException("Invoke fails - fault reported: " + fault.getValue()));
}
SimpleXMLParserDocumentNode resp_node = body.getChild("QueryStateVariableResponse");
if (resp_node == null) {
throw (new UPnPException("Invoke fails - response missing: " + body.getValue()));
}
SimpleXMLParserDocumentNode value_node = resp_node.getChild("return");
return (value_node.getValue());
} catch (Throwable e) {
if (e instanceof UPnPException) {
throw ((UPnPException) e);
}
throw (new UPnPException("Invoke fails", e));
}
}
Aggregations