diff --git a/src/searchengine.qrc b/src/searchengine.qrc index 098d1366d..f4d7169fd 100644 --- a/src/searchengine.qrc +++ b/src/searchengine.qrc @@ -5,6 +5,8 @@ searchengine/nova/nova2.py searchengine/nova/novaprinter.py searchengine/nova/socks.py + searchengine/nova/engines/btdb.png + searchengine/nova/engines/btdb.py searchengine/nova/engines/demonoid.png searchengine/nova/engines/demonoid.py searchengine/nova/engines/extratorrent.png @@ -22,6 +24,8 @@ searchengine/nova3/novaprinter.py searchengine/nova3/sgmllib3.py searchengine/nova3/socks.py + searchengine/nova3/engines/btdb.png + searchengine/nova3/engines/btdb.py searchengine/nova3/engines/demonoid.png searchengine/nova3/engines/demonoid.py searchengine/nova3/engines/extratorrent.png diff --git a/src/searchengine/nova/engines/btdb.png b/src/searchengine/nova/engines/btdb.png new file mode 100644 index 000000000..b63314b9d Binary files /dev/null and b/src/searchengine/nova/engines/btdb.png differ diff --git a/src/searchengine/nova/engines/btdb.py b/src/searchengine/nova/engines/btdb.py new file mode 100644 index 000000000..58ed79c78 --- /dev/null +++ b/src/searchengine/nova/engines/btdb.py @@ -0,0 +1,147 @@ +#VERSION: 1.01 +#AUTHORS: Charles Worthing +#CONTRIBUTORS: Diego de las Heras (ngosang@hotmail.es) + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +from HTMLParser import HTMLParser +#qBt +from novaprinter import prettyPrinter +from helpers import download_file, retrieve_url + +class btdb(object): + """ Search engine class """ + url = 'https://btdb.in' + name = 'BTDB' + + def download_torrent(self, info): + """ Downloader """ + print(download_file(info)) + + class MyHtmlParser(HTMLParser): + """ Parser class """ + def __init__(self, results, url): + HTMLParser.__init__(self) + self.results = results + self.url = url + self.current_item = {} # One torrent result + self.add_query = True + self.torrent_info_index = 0 # Count of the meta data encountered + self.torrent_info_array = [] + self.meta_data_grabbing = 0 + self.meta_data_array = [] + self.torrent_no_files = 0 + self.torrent_date_added = 0 + self.torrent_popularity = 0 + self.mangnet_link = "" + self.desc_link = "" + self.torrent_name = "" + + def handle_starttag(self, tag, attrs): + if tag == "span": + span_dict = dict(attrs) + if "class" in span_dict: + the_class = span_dict["class"] + if the_class == "item-meta-info-value": + self.meta_data_grabbing += 1 + else: + self.meta_data_grabbing = 0 + if tag == "script": + return + if tag == "li": + for attr in attrs: + if attr[1] == "search-ret-item": + self.torrent_info_index = 1 + if tag == "a": + if self.torrent_info_index > 0: + params = dict(attrs) + if "href" in params: + link = params["href"] + if link.startswith("/torrent"): + self.desc_link = "".join((self.url, link)) + self.torrent_name = params["title"] + if link.startswith("magnet:"): + self.mangnet_link = link + + def handle_endtag(self, tag): + if tag == "script": + return + if tag == "div": + if self.meta_data_grabbing > 0: + + self.torrent_no_files = self.meta_data_array[2] # Not used + self.torrent_date_added = self.meta_data_array[4] # Not used + self.torrent_popularity = self.meta_data_array[6] # Not used + + self.current_item["size"] = self.meta_data_array[0] + self.current_item["name"] = self.torrent_name + self.current_item["engine_url"] = self.url + self.current_item["link"] = self.mangnet_link + self.current_item["desc_link"] = self.desc_link + self.current_item["seeds"] = -1 + self.current_item["leech"] = -1 + + prettyPrinter(self.current_item) + self.results.append('a') + self.current_item = {} + + self.meta_data_grabbing = 0 + self.meta_data_array = [] + self.mangnet_link = "" + self.desc_link = "" + self.torrent_name = "" + + def handle_data(self, data): + if self.torrent_info_index > 0: + self.torrent_info_array.append(data) + self.torrent_info_index += 1 + if self.meta_data_grabbing > 0: + self.meta_data_array.append(data) + self.meta_data_grabbing += 1 + + def handle_entityref(self, name): + c = unichr(name2codepoint[name]) + + def handle_charref(self, name): + if name.startswith('x'): + c = unichr(int(name[1:], 16)) + else: + c = unichr(int(name)) + + + def search(self, what, cat='all'): + """ Performs search """ + results_list = [] + parser = self.MyHtmlParser(results_list, self.url) + i = 1 + while i < 31: + # "what" is already urlencoded + html = retrieve_url(self.url + '/q/%s/%d?sort=popular' % (what, i)) + parser.feed(html) + if len(results_list) < 1: + break + del results_list[:] + i += 1 + parser.close() diff --git a/src/searchengine/nova/engines/versions.txt b/src/searchengine/nova/engines/versions.txt index 6446cc457..ac6e0c72d 100644 --- a/src/searchengine/nova/engines/versions.txt +++ b/src/searchengine/nova/engines/versions.txt @@ -1,3 +1,4 @@ +btdb: 1.01 demonoid: 1.23 extratorrent: 3.10 legittorrents: 2.02 diff --git a/src/searchengine/nova3/engines/btdb.png b/src/searchengine/nova3/engines/btdb.png new file mode 100644 index 000000000..b63314b9d Binary files /dev/null and b/src/searchengine/nova3/engines/btdb.png differ diff --git a/src/searchengine/nova3/engines/btdb.py b/src/searchengine/nova3/engines/btdb.py new file mode 100644 index 000000000..555850af4 --- /dev/null +++ b/src/searchengine/nova3/engines/btdb.py @@ -0,0 +1,147 @@ +#VERSION: 1.01 +#AUTHORS: Charles Worthing +#CONTRIBUTORS: Diego de las Heras (ngosang@hotmail.es) + +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the author nor the names of its contributors may be +# used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. + +from html.parser import HTMLParser +#qBt +from novaprinter import prettyPrinter +from helpers import download_file, retrieve_url + +class btdb(object): + """ Search engine class """ + url = 'https://btdb.in' + name = 'BTDB' + + def download_torrent(self, info): + """ Downloader """ + print(download_file(info)) + + class MyHtmlParser(HTMLParser): + """ Parser class """ + def __init__(self, results, url): + HTMLParser.__init__(self) + self.results = results + self.url = url + self.current_item = {} # One torrent result + self.add_query = True + self.torrent_info_index = 0 # Count of the meta data encountered + self.torrent_info_array = [] + self.meta_data_grabbing = 0 + self.meta_data_array = [] + self.torrent_no_files = 0 + self.torrent_date_added = 0 + self.torrent_popularity = 0 + self.mangnet_link = "" + self.desc_link = "" + self.torrent_name = "" + + def handle_starttag(self, tag, attrs): + if tag == "span": + span_dict = dict(attrs) + if "class" in span_dict: + the_class = span_dict["class"] + if the_class == "item-meta-info-value": + self.meta_data_grabbing += 1 + else: + self.meta_data_grabbing = 0 + if tag == "script": + return + if tag == "li": + for attr in attrs: + if attr[1] == "search-ret-item": + self.torrent_info_index = 1 + if tag == "a": + if self.torrent_info_index > 0: + params = dict(attrs) + if "href" in params: + link = params["href"] + if link.startswith("/torrent"): + self.desc_link = "".join((self.url, link)) + self.torrent_name = params["title"] + if link.startswith("magnet:"): + self.mangnet_link = link + + def handle_endtag(self, tag): + if tag == "script": + return + if tag == "div": + if self.meta_data_grabbing > 0: + + self.torrent_no_files = self.meta_data_array[2] # Not used + self.torrent_date_added = self.meta_data_array[4] # Not used + self.torrent_popularity = self.meta_data_array[6] # Not used + + self.current_item["size"] = self.meta_data_array[0] + self.current_item["name"] = self.torrent_name + self.current_item["engine_url"] = self.url + self.current_item["link"] = self.mangnet_link + self.current_item["desc_link"] = self.desc_link + self.current_item["seeds"] = -1 + self.current_item["leech"] = -1 + + prettyPrinter(self.current_item) + self.results.append('a') + self.current_item = {} + + self.meta_data_grabbing = 0 + self.meta_data_array = [] + self.mangnet_link = "" + self.desc_link = "" + self.torrent_name = "" + + def handle_data(self, data): + if self.torrent_info_index > 0: + self.torrent_info_array.append(data) + self.torrent_info_index += 1 + if self.meta_data_grabbing > 0: + self.meta_data_array.append(data) + self.meta_data_grabbing += 1 + + def handle_entityref(self, name): + c = unichr(name2codepoint[name]) + + def handle_charref(self, name): + if name.startswith('x'): + c = unichr(int(name[1:], 16)) + else: + c = unichr(int(name)) + + + def search(self, what, cat='all'): + """ Performs search """ + results_list = [] + parser = self.MyHtmlParser(results_list, self.url) + i = 1 + while i < 31: + # "what" is already urlencoded + html = retrieve_url(self.url + '/q/%s/%d?sort=popular' % (what, i)) + parser.feed(html) + if len(results_list) < 1: + break + del results_list[:] + i += 1 + parser.close() diff --git a/src/searchengine/nova3/engines/versions.txt b/src/searchengine/nova3/engines/versions.txt index 6446cc457..ac6e0c72d 100644 --- a/src/searchengine/nova3/engines/versions.txt +++ b/src/searchengine/nova3/engines/versions.txt @@ -1,3 +1,4 @@ +btdb: 1.01 demonoid: 1.23 extratorrent: 3.10 legittorrents: 2.02