mirror of
				https://github.com/KevinMidboe/seasonedWarden.git
				synced 2025-10-29 18:00:13 +00:00 
			
		
		
		
	Api receiving torrents by POST json & returns a single candidate
Tries best of handling errors in json input and return clear errors.
This commit is contained in:
		
							
								
								
									
										0
									
								
								src/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										101
									
								
								src/main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								src/main.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,101 @@ | ||||
| from flask import Flask, request, jsonify | ||||
| from types import SimpleNamespace | ||||
| from dataclasses import dataclass | ||||
| from typing import List | ||||
| import json | ||||
|  | ||||
| from .warden import findBest | ||||
|  | ||||
| app = Flask(__name__) | ||||
|  | ||||
|  | ||||
| @dataclass | ||||
| class Torrent: | ||||
|   name: str | ||||
|   magnet: str | ||||
|   uploader: str | ||||
|   size: str | ||||
|   date: str | ||||
|   seed: int | ||||
|   leech: str | ||||
|   url: str | ||||
|   release_type: List[str] | ||||
|  | ||||
|   @property | ||||
|   def bytes(self): | ||||
|     UNITS = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; | ||||
|     [numStr, unit] = self.size.split(' ') | ||||
|  | ||||
|     if unit not in UNITS: | ||||
|       return -1 | ||||
|  | ||||
|     exponent = UNITS.index(unit) * 3 | ||||
|     return float(numStr) * pow(10, exponent) | ||||
|  | ||||
|   def __lt__(self, other): | ||||
|     return self.bytes < other.bytes | ||||
|  | ||||
|   def __gt__(self, other): | ||||
|     return self.bytes > other.bytes | ||||
|  | ||||
|   def __repr__(self): | ||||
|     return 'Name: {}, size: {}'.format(self.name, self.size) | ||||
|  | ||||
| @app.route('/api/v1') | ||||
| def index(): | ||||
|   return "Hello world" | ||||
|  | ||||
| @app.route('/api/v1/determine', methods=['POST']) | ||||
| def determine(): | ||||
|   data = request.data | ||||
|   torrents = [] | ||||
|  | ||||
|   try: | ||||
|     torrents = json.loads(data, object_hook=lambda d: Torrent(**d)) | ||||
|   except json.decoder.JSONDecodeError as error: | ||||
|     return closeWithErrorAndCode('Some json error happened', 422, error) | ||||
|   except TypeError as error: | ||||
|     errorMessage = str(error) | ||||
|  | ||||
|     if 'required positional argument' in errorMessage: | ||||
|       argument = errorMessage.split(': ')[-1] | ||||
|       return closeWithErrorAndCode('Missing required argument: {}'.format(argument), 422) | ||||
|     elif 'unexpected keyword argument' in errorMessage: | ||||
|       argument = errorMessage.split('keyword argument ')[-1] | ||||
|       return closeWithErrorAndCode('Found unexpected argument: {}'.format(argument), 422) | ||||
|     return closeWithErrorAndCode('Unable to understand json data, got error.', 422, error) | ||||
|   except: | ||||
|     return closeWithErrorAndCode('Unexpected error occured, could not determine anything here.') | ||||
|  | ||||
|   if len(torrents) == 0: | ||||
|     return closeWithErrorAndCode('Parsable but no torrents found, nothing to do.') | ||||
|  | ||||
|   luckyBoyBest = findBest(torrents) | ||||
|  | ||||
|   data = { | ||||
|     'message': 'Found a lucky boy bby', | ||||
|     'torrent': luckyBoyBest, | ||||
|     'success': True | ||||
|   } | ||||
|  | ||||
|   return data, 200 | ||||
|  | ||||
|  | ||||
| def closeWithSuccessAndMessage(message): | ||||
|   data = { | ||||
|     'message': message, | ||||
|     'success': True, | ||||
|   } | ||||
|  | ||||
|   return data, 200 | ||||
|  | ||||
| def closeWithErrorAndCode(message=None, statusCode=500, error=None): | ||||
|   data = { | ||||
|     'message': message or 'Unexpected error occured.', | ||||
|     'success': False | ||||
|   } | ||||
|  | ||||
|   if error is not None: | ||||
|     data['error'] = str(error) | ||||
|  | ||||
|   return data, statusCode | ||||
		Reference in New Issue
	
	Block a user