86 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python3.6
 | |
| # -*- encoding: utf-8 -*-
 | |
| 
 | |
| import json
 | |
| import logging
 | |
| import logging.config
 | |
| 
 | |
| from jackett import Jackett
 | |
| from piratebay import Piratebay
 | |
| from utils import ColorizeFilter, getConfig
 | |
| 
 | |
| from pprint import pprint
 | |
| 
 | |
| logger = logging.getLogger('torrentSearch')
 | |
| 
 | |
| def createJSONList(torrents):
 | |
|    """
 | |
|    Iterates over all torrent objects in torrents and gets all attributes which are appended to a list
 | |
| 
 | |
|    :param list torrents: integer of size of torrent file
 | |
|    :return: List of torrents with all their info in a JSON format
 | |
|    :rtype: str
 | |
|    """
 | |
|    jsonList = []
 | |
|    for torrent in torrents:
 | |
|       jsonList.append(torrent.get_all_attr())
 | |
| 
 | |
|    return json.dumps(jsonList)
 | |
| 
 | |
| # This should be done front_end!
 | |
| # I.E. filtering like this should be done in another script
 | |
| # and should be done with the shared standard for types.
 | |
| # PS: Is it the right move to use a shared standard? What
 | |
| # happens if it is no longer public?
 | |
| def chooseCandidate(torrent_list):
 | |
|    """
 | |
|    Takes a list of torrents and filtes then on a given release type
 | |
|    Returns: JSON list of torrents only matching release type
 | |
|    """
 | |
|    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)
 | |
| 
 | |
|       size, _, size_id = torrent.size.partition(' ')
 | |
|       if intersecting_release_types:
 | |
|          interesting_torrents.append(torrent)
 | |
| 
 | |
|    return interesting_torrents
 | |
| 
 | |
| 
 | |
| def searchTorrentSite(query, site='jackett', filter=None, print_result=False, config=None):
 | |
|    """
 | |
|    Selects site based on input and finds torrents for that site based on query
 | |
| 
 | |
|    :param configparser.ConfigParser config: integer of size of torrent filest
 | |
|    :param str query: query to search search torrents for
 | |
|    :param str site: the site we want to index/scrape
 | |
|    :param boolean print_result: if the in results should be printed to terminal
 | |
|    :return: json list with results
 | |
|    :rtype: str
 | |
|    """
 | |
|    if config is None:
 | |
|       config = getConfig()
 | |
|    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'])
 | |
|       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)
 | |
| 
 | |
|    if (filter):
 | |
|       torrents_found = chooseCandidate(torrents_found)
 | |
| 
 | |
|    jsonList = createJSONList(torrents_found)
 | |
| 
 | |
|    if (print_result):
 | |
|       print(jsonList)
 | |
| 
 | |
|    return jsonList
 |