You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
172 lines
7.2 KiB
172 lines
7.2 KiB
/* |
|
* Copyright 2010-2018 Eric Kok et al. |
|
* |
|
* Transdroid 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, either version 3 of the License, or |
|
* (at your option) any later version. |
|
* |
|
* Transdroid 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 Transdroid. If not, see <http://www.gnu.org/licenses/>. |
|
*/ |
|
package org.transdroid.core.app.search; |
|
|
|
import java.io.FileNotFoundException; |
|
import java.io.InputStream; |
|
import java.io.UnsupportedEncodingException; |
|
import java.net.URLEncoder; |
|
import java.util.ArrayList; |
|
import java.util.List; |
|
|
|
import org.androidannotations.annotations.EBean; |
|
import org.androidannotations.annotations.EBean.Scope; |
|
import org.androidannotations.annotations.RootContext; |
|
|
|
import android.content.ContentProviderClient; |
|
import android.content.Context; |
|
import android.database.Cursor; |
|
import android.net.Uri; |
|
|
|
@EBean(scope = Scope.Singleton) |
|
public class SearchHelper { |
|
|
|
static final int CURSOR_SEARCH_ID = 0; |
|
static final int CURSOR_SEARCH_NAME = 1; |
|
static final int CURSOR_SEARCH_TORRENTURL = 2; |
|
static final int CURSOR_SEARCH_DETAILSURL = 3; |
|
static final int CURSOR_SEARCH_SIZE = 4; |
|
static final int CURSOR_SEARCH_ADDED = 5; |
|
static final int CURSOR_SEARCH_SEEDERS = 6; |
|
static final int CURSOR_SEARCH_LEECHERS = 7; |
|
|
|
static final int CURSOR_SITE_ID = 0; |
|
static final int CURSOR_SITE_CODE = 1; |
|
static final int CURSOR_SITE_NAME = 2; |
|
static final int CURSOR_SITE_RSSURL = 3; |
|
static final int CURSOR_SITE_ISPRIVATE = 4; |
|
|
|
@RootContext |
|
protected Context context; |
|
|
|
public enum SearchSortOrder { |
|
Combined, BySeeders |
|
} |
|
|
|
/** |
|
* Return whether the Torrent Search package is installed and available to query against |
|
* |
|
* @return True if the available sites can be retrieved from the content provider, false otherwise |
|
*/ |
|
public boolean isTorrentSearchInstalled() { |
|
return getAvailableSites() != null; |
|
} |
|
|
|
/** |
|
* Queries the Torrent Search package for all available in-app search sites. This method is synchronous. |
|
* |
|
* @return A list of available search sites as POJOs, or null if the Torrent Search package is not installed |
|
*/ |
|
public List<SearchSite> getAvailableSites() { |
|
|
|
// Try to access the TorrentSitesProvider of the Torrent Search app |
|
Uri uri = Uri.parse("content://org.transdroid.search.torrentsitesprovider/sites"); |
|
ContentProviderClient test = context.getContentResolver().acquireContentProviderClient(uri); |
|
if (test == null) { |
|
// Torrent Search package is not yet installed |
|
return null; |
|
} |
|
|
|
// Query the available in-app torrent search sites |
|
Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); |
|
if (cursor == null) { |
|
// The installed Torrent Search version is corrupt or incompatible |
|
return null; |
|
} |
|
List<SearchSite> sites = new ArrayList<>(); |
|
if (cursor.moveToFirst()) { |
|
do { |
|
// Read the cursor fields into the SearchSite object |
|
sites.add(new SearchSite(cursor.getInt(CURSOR_SITE_ID), cursor.getString(CURSOR_SITE_CODE), cursor |
|
.getString(CURSOR_SITE_NAME), cursor.getString(CURSOR_SITE_RSSURL), |
|
cursor.getColumnNames().length > 4 && cursor.getInt(CURSOR_SITE_ISPRIVATE) == 1)); |
|
} while (cursor.moveToNext()); |
|
} |
|
|
|
cursor.close(); |
|
return sites; |
|
|
|
} |
|
|
|
/** |
|
* Queries the Torrent Search module to search for torrents on the web. This method is synchronous and should always |
|
* be called in a background thread. |
|
* |
|
* @param query The search query to pass to the torrent site |
|
* @param site The site to search, as retrieved from the TorrentSitesProvider, or null if the Torrent Search package |
|
* @param sortBy The sort order to request from the torrent site, if supported |
|
* @return A list of torrent search results as POJOs, or null if the Torrent Search package is not installed or |
|
* there is no internet connection |
|
*/ |
|
public ArrayList<SearchResult> search(String query, SearchSite site, SearchSortOrder sortBy) { |
|
|
|
// Try to query the TorrentSearchProvider to search for torrents on the web |
|
Uri uri = Uri.parse("content://org.transdroid.search.torrentsearchprovider/search/" + query); |
|
Cursor cursor; |
|
if (site == null) { |
|
// If no explicit site was supplied, rely on the Torrent Search package's default |
|
cursor = context.getContentResolver().query(uri, null, null, null, sortBy.name()); |
|
} else { |
|
cursor = context.getContentResolver().query(uri, null, "SITE = ?", new String[]{site.getKey()}, |
|
sortBy.name()); |
|
} |
|
if (cursor == null) { |
|
// The content provider could not load any content (for example when there is no connection) |
|
return null; |
|
} |
|
if (cursor.moveToFirst()) { |
|
ArrayList<SearchResult> results = new ArrayList<>(); |
|
do { |
|
// Read the cursor fields into the SearchResult object |
|
results.add(new SearchResult(cursor.getInt(CURSOR_SEARCH_ID), cursor.getString(CURSOR_SEARCH_NAME), |
|
cursor.getString(CURSOR_SEARCH_TORRENTURL), cursor.getString(CURSOR_SEARCH_DETAILSURL), cursor |
|
.getString(CURSOR_SEARCH_SIZE), cursor.getLong(CURSOR_SEARCH_ADDED), cursor |
|
.getString(CURSOR_SEARCH_SEEDERS), cursor.getString(CURSOR_SEARCH_LEECHERS))); |
|
} while (cursor.moveToNext()); |
|
cursor.close(); |
|
return results; |
|
} |
|
|
|
// Torrent Search package is not yet installed |
|
cursor.close(); |
|
return null; |
|
|
|
} |
|
|
|
/** |
|
* Asks the Torrent Search module to download a torrent file given the provided url, while using the specifics of |
|
* the supplied torrent search site to do so. This way the Search Module can take care of user credentials, for |
|
* example. |
|
* |
|
* @param site The unique key of the search site that this url belongs to, which is used to create a connection |
|
* specific to this (private) site |
|
* @param url The full url of the torrent to download |
|
* @return A file input stream handler that points to the locally downloaded file |
|
* @throws FileNotFoundException Thrown when the requested url could not be downloaded or is not locally available |
|
*/ |
|
public InputStream getFile(String site, String url) throws FileNotFoundException { |
|
try { |
|
Uri uri = Uri.parse("content://org.transdroid.search.torrentsearchprovider/get/" + site + "/" |
|
+ URLEncoder.encode(url, "UTF-8")); |
|
return context.getContentResolver().openInputStream(uri); |
|
} catch (UnsupportedEncodingException e) { |
|
// Ignore |
|
return null; |
|
} |
|
} |
|
|
|
}
|
|
|