org.transdroid.search.RssFeedSearch.PretomeAdapter.java Source code

Java tutorial

Introduction

Here is the source code for org.transdroid.search.RssFeedSearch.PretomeAdapter.java

Source

/*
 *   This file is part of Transdroid Torrent Search 
 *   <http://code.google.com/p/transdroid-search/>
 *   
 *   Transdroid Torrent Search is free software: you can redistribute 
 *   it and/or modify it under the terms of the GNU Lesser General 
 *   Public License as published by the Free Software Foundation, 
 *   either version 3 of the License, or (at your option) any later 
 *   version.
 *   
 *   Transdroid Torrent Search 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 Lesser General Public License for more details.
 *   
 *   You should have received a copy of the GNU Lesser General Public 
 *   License along with Transdroid.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.transdroid.search.RssFeedSearch;

import android.content.SharedPreferences;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.ifies.android.sax.Item;
import org.ifies.android.sax.RssParser;
import org.transdroid.search.SearchResult;
import org.transdroid.search.SortOrder;
import org.transdroid.search.TorrentSite;
import org.transdroid.search.gui.SettingsHelper;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidParameterException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

/**
 * Search adapter for the Pretome private torrent site (based on custom search RSS feeds). Requires user to enter their RSS feed token.
 * @author Eric Kok
 */
public class PretomeAdapter extends RssFeedSearchAdapter {

    private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);

    private SharedPreferences prefs;

    @Override
    public List<SearchResult> search(SharedPreferences prefs, String query, SortOrder order, int maxResults)
            throws Exception {
        this.prefs = prefs;
        return super.search(prefs, query, order, maxResults);
    }

    @Override
    protected String getUrl(String query, SortOrder order) {
        String token = SettingsHelper.getSiteToken(prefs, TorrentSite.Pretome);
        if (token == null) {
            throw new InvalidParameterException(
                    "No RSS feed token was provided, while this is required for this private site.");
        }

        // NOTE: Torrent Reactor doesn't support sorting in the RSS feed
        try {
            return String.format(Locale.US,
                    "https://pretome.info/rss.php?st=1&tf=all&search=%2$s&sort=%3$s&type=d&key=%1$s&full", token,
                    URLEncoder.encode(query, "UTF-8"), order == SortOrder.BySeeders ? "7" : "0");
        } catch (UnsupportedEncodingException e) {
            return null;
        }
    }

    protected SearchResult fromRssItemToSearchResult(Item item) {
        // Size
        String d = item.getDescription();
        int sizeStart = d.indexOf("Size: ") + "Size: ".length();
        String size = d.substring(sizeStart, d.indexOf("(", sizeStart));
        // Date
        int dateStart = d.indexOf("Added: ", sizeStart) + "Added: ".length();
        String dateString = d.substring(dateStart, d.indexOf(" (", dateStart));
        Date date = null;
        try {
            date = DATE_FORMAT.parse(dateString);
        } catch (ParseException e) {
            // Leave date null
        }
        // Torrent link
        int idStart = item.getLink().indexOf("?id=") + "?id=".length();
        String id = item.getLink().substring(idStart, item.getLink().indexOf("&", idStart));
        String torrentLink = String.format(Locale.US, "https://pretome.info/download.php/%1$s/%2$s.torrent", id,
                item.getTitle());

        // NOTE Pretome does not report seeders/leechers in RSS feeds
        return new SearchResult(item.getTitle(), torrentLink, item.getLink(), size, date, 0, 0);
    }

    @Override
    public String getSiteName() {
        return "Pretome";
    }

    @Override
    public boolean isPrivateSite() {
        return true;
    }

    @Override
    public boolean usesToken() {
        return true;
    }

    @Override
    protected RssParser getRssParser(final String url) {
        return new RssParser(url) {
            @Override
            public void parse() throws ParserConfigurationException, SAXException, IOException {
                HttpClient httpclient = initialise();
                HttpResponse result = httpclient.execute(new HttpGet(url));
                //FileInputStream urlInputStream = new FileInputStream("/sdcard/rsstest2.txt");
                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParser sp = spf.newSAXParser();
                InputSource is = new InputSource();
                // Pretome supplies UTF-8 compatible character data yet incorrectly defined a windows-1251 encode: override
                is.setEncoding("UTF-8");
                is.setCharacterStream(new InputStreamReader(result.getEntity().getContent()));
                sp.parse(is, this);
            }
        };
    }

}