/*
* Created on May 6, 2008
* Created by Paul Gardner
*
* Copyright 2008 Vuze, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
package com.aelitis.azureus.core.metasearch.impl.web;
import java.util.Date;
import java.util.StringTokenizer;
import org.apache.commons.lang.*;
import org.gudy.azureus2.core3.util.Base32;
import org.gudy.azureus2.core3.util.ByteFormatter;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.core3.util.UrlUtils;
import com.aelitis.azureus.core.metasearch.Engine;
import com.aelitis.azureus.core.metasearch.Result;
import com.aelitis.azureus.core.metasearch.impl.DateParser;
public class WebResult extends Result {
String searchQuery;
String rootPageURL;
String basePageURL;
DateParser dateParser;
String contentType = "";
String name;
String category = "";
String drmKey = null;
Date publishedDate;
long size = -1;
int nbPeers = -1;
int nbSeeds = -1;
int nbSuperSeeds = -1;
int comments = -1;
int votes = -1;
int votesDown = -1;
float rank = -1;
boolean privateTorrent;
String cdpLink;
String torrentLink;
String downloadButtonLink;
String playLink;
String uid;
String hash;
public WebResult(Engine engine, String rootPageURL,String basePageURL,DateParser dateParser,String searchQuery) {
super( engine );
this.rootPageURL = rootPageURL;
this.basePageURL = basePageURL;
this.dateParser = dateParser;
this.searchQuery = searchQuery;
}
public void setName(String name) {
if(name != null) {
this.name = name;
}
}
public void setNameFromHTML(String name) {
if(name != null) {
name = removeHTMLTags(name);
this.name = Entities.HTML40.unescape(name);
}
}
public void setCommentsFromHTML(String comments) {
if(comments != null) {
comments = removeHTMLTags(comments);
comments = Entities.HTML40.unescape(comments);
comments = comments.replaceAll(",", "");
comments = comments.replaceAll(" ", "");
try{
this.comments = Integer.parseInt(comments);
}catch( Throwable e ){
//e.printStackTrace();
}
}
}
public void setCategoryFromHTML(String category) {
if(category != null) {
category = removeHTMLTags(category);
this.category = Entities.HTML40.unescape(category).trim();
/*int separator = this.category.indexOf(">");
if(separator != -1) {
this.category = this.category.substring(separator+1).trim();
}*/
}
}
public void
setUID(
String _uid )
{
uid = _uid;
}
public String
getUID()
{
return( uid );
}
public void setNbPeersFromHTML(String nbPeers) {
if(nbPeers != null) {
nbPeers = removeHTMLTags(nbPeers);
String nbPeersS = Entities.HTML40.unescape(nbPeers);
nbPeersS = nbPeersS.replaceAll(",", "");
nbPeersS = nbPeersS.replaceAll(" ", "");
try {
this.nbPeers = Integer.parseInt(nbPeersS);
} catch(Throwable e) {
//this.nbPeers = 0;
//e.printStackTrace();
}
}
}
public void setNbSeedsFromHTML(String nbSeeds) {
if(nbSeeds != null) {
nbSeeds = removeHTMLTags(nbSeeds);
String nbSeedsS = Entities.HTML40.unescape(nbSeeds);
nbSeedsS = nbSeedsS.replaceAll(",", "");
nbSeedsS = nbSeedsS.replaceAll(" ", "");
try {
this.nbSeeds = Integer.parseInt(nbSeedsS);
} catch(Throwable e) {
//this.nbSeeds = 0;
//e.printStackTrace();
}
}
}
public void setNbSuperSeedsFromHTML(String nbSuperSeeds) {
if(nbSuperSeeds != null) {
nbSuperSeeds = removeHTMLTags(nbSuperSeeds);
String nbSuperSeedsS = Entities.HTML40.unescape(nbSuperSeeds);
nbSuperSeedsS = nbSuperSeedsS.replaceAll(",", "");
nbSuperSeedsS = nbSuperSeedsS.replaceAll(" ", "");
try {
this.nbSuperSeeds = Integer.parseInt(nbSuperSeedsS);
} catch(Throwable e) {
//this.nbSeeds = 0;
//e.printStackTrace();
}
}
}
public void setRankFromHTML( String rank_str, float divisor ){
if (rank_str == null) {
return;
}
try{
float f = Float.parseFloat( rank_str.trim() );
rank = f / divisor;
}catch( Throwable e ){
}
}
public void setRankFromHTML( String rank_str ){
if ( rank_str != null ){
try{
// either a float 0->1 or integer 0->100
float f = Float.parseFloat( rank_str.trim() );
if ( rank_str.indexOf( "." ) == -1 ){
if ( f >= 0 && f <= 100 ){
rank = f/100;
}
}else{
if ( f >= 0 && f <= 1 ){
rank = f;
}
}
}catch( Throwable e ){
}
}
}
public float
getRank()
{
if ( rank != -1 ){
return( applyRankBias( rank ));
}
return( super.getRank());
}
public void setPublishedDate(Date date) {
this.publishedDate = date;
}
public void setPublishedDateFromHTML(String publishedDate) {
if(publishedDate != null) {
publishedDate = removeHTMLTags(publishedDate);
String publishedDateS = Entities.HTML40.unescape(publishedDate).replace((char)160,(char)32);
this.publishedDate = dateParser.parseDate(publishedDateS);
}
}
public void setSizeFromHTML(String size) {
if(size != null) {
size = removeHTMLTags(size);
String sizeS = Entities.HTML40.unescape(size).replace((char)160,(char)32);
sizeS = sizeS.replaceAll("<[^>]+>", " ");
//Add a space between the digits and unit if there is none
sizeS = sizeS.replaceFirst("(\\d)([a-zA-Z])", "$1 $2");
try {
StringTokenizer st = new StringTokenizer(sizeS," ");
double base = Double.parseDouble(st.nextToken());
String unit = "b";
try {
unit = st.nextToken().toLowerCase();
} catch(Throwable e) {
//No unit
}
long multiplier = 1;
long KB_UNIT = 1024;
long KIB_UNIT = 1024;
if("mb".equals(unit)) {
multiplier = KB_UNIT*KB_UNIT;
} else if("mib".equals(unit)) {
multiplier = KIB_UNIT*KIB_UNIT;
} else if("m".equals(unit)) {
multiplier = KIB_UNIT*KIB_UNIT;
} else if("gb".equals(unit)) {
multiplier = KB_UNIT*KB_UNIT*KB_UNIT;
} else if("gib".equals(unit)) {
multiplier = KIB_UNIT*KIB_UNIT*KIB_UNIT;
} else if("g".equals(unit)) {
multiplier = KIB_UNIT*KIB_UNIT*KIB_UNIT;
} else if("kb".equals(unit)) {
multiplier = KB_UNIT;
} else if("kib".equals(unit)) {
multiplier = KIB_UNIT;
} else if("k".equals(unit)) {
multiplier = KIB_UNIT;
}
this.size = (long) (base * multiplier);
} catch(Throwable e) {
//e.printStackTrace();
}
}
}
public void setVotesFromHTML(String votes_str) {
if(votes_str != null) {
votes_str = removeHTMLTags(votes_str);
votes_str = Entities.HTML40.unescape(votes_str);
votes_str = votes_str.replaceAll(",", "");
votes_str = votes_str.replaceAll(" ", "");
try {
this.votes = Integer.parseInt(votes_str);
} catch(Throwable e) {
//e.printStackTrace();
}
}
}
public void setVotesDownFromHTML(String votes_str) {
if(votes_str != null) {
votes_str = removeHTMLTags(votes_str);
votes_str = Entities.HTML40.unescape(votes_str);
votes_str = votes_str.replaceAll(",", "");
votes_str = votes_str.replaceAll(" ", "");
try {
this.votesDown = Integer.parseInt(votes_str);
} catch(Throwable e) {
//e.printStackTrace();
}
}
}
public void setPrivateFromHTML(String privateTorrent) {
if(privateTorrent != null && ! "".equals(privateTorrent)) {
this.privateTorrent = true;
}
}
public int
getVotes()
{
return( votes );
}
public int
getVotesDown()
{
return( votesDown );
}
public void setCDPLink(String cdpLink) {
this.cdpLink = UrlUtils.unescapeXML(cdpLink);
}
public void setDownloadButtonLink(String downloadButtonLink) {
this.downloadButtonLink = UrlUtils.unescapeXML(downloadButtonLink);
}
public void setTorrentLink(String torrentLink) {
this.torrentLink = UrlUtils.unescapeXML(torrentLink);
}
public void setPlayLink(String playLink) {
this.playLink = playLink;
}
public String getContentType() {
return this.contentType;
}
public String getPlayLink() {
return( reConstructLink( playLink ));
}
public void setCategory(String category) {
this.category = category;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public void setDrmKey(String drmKey) {
this.drmKey = drmKey;
}
public void
setHash(
String _hash )
{
try{
hash = _hash.trim();
if ( hash.length() == 32 ){
// base 32 hash
}else if ( hash.length() == 40 ){
// base 16
hash = Base32.encode( ByteFormatter.decodeString( hash ));
}else{
hash = null;
}
}catch( Throwable e ){
Debug.printStackTrace(e);
hash = null;
}
if(hash != null && downloadButtonLink == null) {
setDownloadButtonLink(UrlUtils.normaliseMagnetURI(hash));
}
if(hash != null && torrentLink == null) {
setTorrentLink(UrlUtils.normaliseMagnetURI(hash));
}
}
public String
getHash()
{
return( hash );
}
public String getCDPLink() {
return reConstructLink(cdpLink);
}
public String getCategory() {
return category;
}
public String getDownloadLink() {
return reConstructLink(torrentLink);
}
public String getDownloadButtonLink() {
//If we don't have a download button link, but we do have a direct download link,
//then we should use the direct download link...
if(downloadButtonLink != null) {
return reConstructLink(downloadButtonLink);
} else {
return getDownloadLink();
}
}
private String
reConstructLink(
String link)
{
if ( link != null ){
String lc_link = link.toLowerCase();
if ( lc_link.startsWith("http://") ||
lc_link.startsWith("https://") ||
lc_link.startsWith("azplug:") ||
lc_link.startsWith("magnet:") ||
lc_link.startsWith("bc:") ||
lc_link.startsWith("bctp:") ||
lc_link.startsWith("dht:" )){
return( link );
}
if ( link.startsWith("/")){
return((rootPageURL==null?"":rootPageURL) + link );
}
return((basePageURL==null?"":basePageURL) + link );
}
return( "" );
}
public String getName() {
return name;
}
public int getNbPeers() {
return nbPeers;
}
public int getNbSeeds() {
return nbSeeds;
}
public int getNbSuperSeeds() {
return nbSuperSeeds;
}
public Date getPublishedDate() {
return publishedDate;
}
public long getSize() {
return size;
}
public int
getComments()
{
return( comments );
}
public String getSearchQuery() {
return searchQuery;
}
public boolean isPrivate() {
return privateTorrent;
}
public String getDRMKey() {
return drmKey;
}
public float getAccuracy() {
return -1;
}
}