Rewrote most of search. Now we use docopt instead of argparser for parsing input arguments. Changed indentation to 3 spaces from 4 tabs. Added logging, this is where the parent logger for the project is defined. Main function changes things like logging level and makes sure that the query is defined.

This commit is contained in:
2017-12-22 11:47:10 +01:00
parent 46455dc04a
commit db75cba06a

View File

@@ -1,25 +1,98 @@
#!/usr/bin/env python3.6
import configparser
import sys, argparse, json, os
# -*- encoding: utf-8 -*-
"""Torrent Search.
Usage:
search.py <query> [-s <site>] [-p | --print] [--debug | --warning | --error]
search.py (-h | --help)
search.py --version
Options:
-h --help Show this screen
-s [site] Site to index [default: piratebay] (piratebay|jackett)
-p --print Print result to console
--version Show version
--debug Print all debug logs
--warning Print only logged warnings
--error Print error messages (Error/Warning)
"""
import sys
import argparse
import json
import os
import logging
import logging.config
import configparser
import signal
from docopt import docopt
from torrentSearch import __version__
from jackett import Jackett
from piratebay import Piratebay
from torrentSearch.piratebay import Piratebay
from torrentSearch.utils import ColorizeFilter
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
def getConfig():
config = configparser.ConfigParser()
config_dir = os.path.join(BASE_DIR, 'config.ini')
config.read(config_dir)
ch = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s %(levelname)8s %(name)s | %(message)s')
ch.setFormatter(formatter)
return config
logger = logging.getLogger('torrentSearch')
logger.addHandler(ch)
logger.setLevel(logging.ERROR) # This toggles all the logging in your app
logger.addFilter(ColorizeFilter())
def main():
"""
Main function, call searchTorrentSite
"""
signal.signal(signal.SIGINT, signal_handler)
arguments = docopt(__doc__, version=__version__)
if arguments['--debug']:
logger.level = logging.DEBUG
elif arguments['--warning']:
logger.level = logging.WARNING
elif arguments['--error']:
logger.level = logging.ERROR
logger.info('Torrent Searcher')
logger.debug(arguments)
# Fetch config
config = getConfig()
if arguments['-s'] in config['DEFAULT']['SITE_OPTIONS'].split(','):
site = arguments['-s']
logger.debug('site selected: {}'.format(site))
else:
logger.error('"{}" is a invalid site. Select from: {}'.format(arguments['-s'], config['DEFAULT']['SITE_OPTIONS']))
sys.exit()
searchTorrentSite(config, arguments['<query>'], site, arguments['--print'])
def getConfig():
"""
Read path and get configuartion file with site settings
Returns config [configparser]
"""
config = configparser.ConfigParser()
config_dir = os.path.join(BASE_DIR, 'config.ini')
config.read(config_dir)
return config
def createJSONList(torrents):
jsonList = []
for torrent in torrents:
jsonList.append(torrent.get_all_attr())
jsonList = []
for torrent in torrents:
jsonList.append(torrent.get_all_attr())
return json.dumps(jsonList)
return json.dumps(jsonList)
# This should be done front_end!
# I.E. filtering like this should be done in another script
@@ -27,76 +100,65 @@ def createJSONList(torrents):
# PS: Is it the right move to use a shared standard? What
# happens if it is no longer public?
def chooseCandidate(torrent_list):
interesting_torrents = []
match_release_type = ['bdremux', 'brremux', 'remux', 'bdrip', 'brrip', 'blu-ray', 'bluray', 'bdmv', 'bdr', 'bd5']
interesting_torrents = []
match_release_type = ['bdremux', 'brremux', 'remux', 'bdrip', 'brrip', 'blu-ray', 'bluray', 'bdmv', 'bdr', 'bd5']
for torrent in torrent_list:
intersecting_release_types = set(torrent.find_release_type()) & set(match_release_type)
for torrent in torrent_list:
intersecting_release_types = set(torrent.find_release_type()) & set(match_release_type)
size, _, size_id = torrent.size.partition(' ')
# if intersecting_release_types and int(torrent.seed_count) > 0 and float(size) > 4 and size_id == 'GiB':
if intersecting_release_types:
interesting_torrents.append(torrent.get_all_attr())
# print('{} : {} : {} {}'.format(torrent.name, torrent.size, torrent.seed_count, torrent.magnet))
# interesting_torrents.append(torrent)
# else:
# print('Denied match! %s : %s : %s' % (torrent.name, torrent.size, torrent.seed_count))
size, _, size_id = torrent.size.partition(' ')
# if intersecting_release_types and int(torrent.seed_count) > 0 and float(size) > 4 and size_id == 'GiB':
if intersecting_release_types:
interesting_torrents.append(torrent.get_all_attr())
# print('{} : {} : {} {}'.format(torrent.name, torrent.size, torrent.seed_count, torrent.magnet))
# interesting_torrents.append(torrent)
# else:
# print('Denied match! %s : %s : %s' % (torrent.name, torrent.size, torrent.seed_count))
return interesting_torrents
return interesting_torrents
def searchTorrentSite(config, query, site):
if site == 'piratebay':
pirate = Piratebay(config['PIRATEBAY']['HOST'], config['PIRATEBAY']['PATH'],
config['PIRATEBAY']['LIMIT'], config['PIRATEBAY']['SSL'])
torrents_found = pirate.search(query)
elif site == 'jackett':
jackett = Jackett(config['JACKETT']['APIKEY'], config['JACKETT']['HOST'],
config['JACKETT']['PATH'], config['JACKETT']['LIMIT'], config.getboolean('JACKETT', 'SSL'))
torrents_found = jackett.search(query)
def searchTorrentSite(config, query, site, print_result):
logger.debug('Searching for query {} at {}'.format(query, site))
if site == 'piratebay':
pirate = Piratebay(config['PIRATEBAY']['HOST'], config['PIRATEBAY']['PATH'],
config['PIRATEBAY']['LIMIT'], config['PIRATEBAY']['SSL'])
print(pirate)
print('why no here?')
torrents_found = pirate.search(query)
elif site == 'jackett':
jackett = Jackett(config['JACKETT']['APIKEY'], config['JACKETT']['HOST'],
config['JACKETT']['PATH'], config['JACKETT']['LIMIT'], config.getboolean('JACKETT', 'SSL'))
torrents_found = jackett.search(query)
jsonList = createJSONList(torrents_found)
print(jsonList)
jsonList = createJSONList(torrents_found)
# THIS BELOW IS IF WE ONLY WANT TO SEARCH FOR HQ CONTENT
# candidates = chooseCandidate(torrents_found)
# print(json.dumps(candidates))
if (print_result):
print(jsonList)
return jsonList
# THIS BELOW IS IF WE ONLY WANT TO SEARCH FOR HQ CONTENT
# candidates = chooseCandidate(torrents_found)
# print(json.dumps(candidates))
# print('Length full: {}'.format(len(candidates)))
# print('Length movies: {}'.format(len(movie_candidates)))
# torrents_found = pirate.next_page()
# pprint(torrents_found)
# candidates = chooseCandidate(torrents_found)
# print('Length full: {}'.format(len(candidates)))
# print('Length movies: {}'.format(len(movie_candidates)))
# torrents_found = pirate.next_page()
# pprint(torrents_found)
# candidates = chooseCandidate(torrents_found)
# Can autocall to next_page in a looped way to get more if nothing is found
# and there is more pages to be looked at
# Can autocall to next_page in a looped way to get more if nothing is found
# and there is more pages to be looked at
def main():
site_options = ['jackett', 'piratebay']
parser = argparse.ArgumentParser(prog='Torrent Search', description='Search different torrent sites by query.')
parser.add_argument('query',
nargs='+',
help='query for searching torrents.')
parser.add_argument('-s', '--site',
nargs='?',
default='piratebay',
const='piratebay',
type=str,
choices=site_options,
help='the site to index (default: %(default)s)')
parser.add_argument('-v',
action='store_true',
help='verbose output.')
# TODO add option to change default in config
args = parser.parse_args()
config = getConfig()
searchTorrentSite(config, args.query, args.site)
def signal_handler(signal, frame):
"""
Handle exit by Keyboardinterrupt
"""
logger.info('\nGood bye!')
sys.exit(0)
if __name__ == '__main__':
main()
main()