Compare commits
	
		
			6 Commits
		
	
	
		
			98d307db73
			...
			c5830aeadc
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c5830aeadc | |||
| 3b33fd65a7 | |||
| ffb9e9d5f4 | |||
| 4ce2163e19 | |||
| 65fe4b707c | |||
| 1110f3b024 | 
							
								
								
									
										1
									
								
								.idea/inspectionProfiles/profiles_settings.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										1
									
								
								.idea/inspectionProfiles/profiles_settings.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,5 +1,6 @@ | |||||||
| <component name="InspectionProjectProfileManager"> | <component name="InspectionProjectProfileManager"> | ||||||
|   <settings> |   <settings> | ||||||
|  |     <option name="PROJECT_PROFILE" value="Default" /> | ||||||
|     <option name="USE_PROJECT_PROFILE" value="false" /> |     <option name="USE_PROJECT_PROFILE" value="false" /> | ||||||
|     <version value="1.0" /> |     <version value="1.0" /> | ||||||
|   </settings> |   </settings> | ||||||
|   | |||||||
| @@ -7,9 +7,11 @@ import requests | |||||||
| import inflect | import inflect | ||||||
| from rich.logging import RichHandler | from rich.logging import RichHandler | ||||||
| from rich.traceback import install | from rich.traceback import install | ||||||
| from rich import print |  | ||||||
| import typing as t | import typing as t | ||||||
| from rich.console import Console | from rich.console import Console | ||||||
|  | from type_def.mvw_json_request import MVWJSONRequest | ||||||
|  | from type_def.mvw_json_response import MVWJSONResponse | ||||||
|  | 
 | ||||||
| # Without width | # Without width | ||||||
| console = Console(width=180) | console = Console(width=180) | ||||||
| p = inflect.engine() | p = inflect.engine() | ||||||
| @@ -73,7 +75,8 @@ log_connectionpool.setLevel(logging.WARNING) | |||||||
| install(show_locals=True) | install(show_locals=True) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class ConfigParser(configparser.ConfigParser): | class ConfigParser( | ||||||
|  |         configparser.ConfigParser): | ||||||
|     """Can get options() without defaults |     """Can get options() without defaults | ||||||
| 
 | 
 | ||||||
|     Taken from https://stackoverflow.com/a/12600066. |     Taken from https://stackoverflow.com/a/12600066. | ||||||
| @@ -95,11 +98,13 @@ config = ConfigParser(defaults=internal_defaults) | |||||||
| config.read(CONST.CFG_DEFAULT_FILENAME) | config.read(CONST.CFG_DEFAULT_FILENAME) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def print_section_header(header: str) -> str: | def print_section_header( | ||||||
|  |         header: str) -> str: | ||||||
|     return f"Loading config section '[{header}]' ..." |     return f"Loading config section '[{header}]' ..." | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def validate_default_section(config_obj: configparser.ConfigParser()) -> None: | def validate_default_section( | ||||||
|  |         config_obj: configparser.ConfigParser()) -> None: | ||||||
|     log.debug(f"Loading config from file '{CONST.CFG_DEFAULT_ABS_PATH}' ...") |     log.debug(f"Loading config from file '{CONST.CFG_DEFAULT_ABS_PATH}' ...") | ||||||
|     if not config_obj.sections(): |     if not config_obj.sections(): | ||||||
|         log.error(f"No config sections found in '{CONST.CFG_DEFAULT_ABS_PATH}'. Exiting 1 ...") |         log.error(f"No config sections found in '{CONST.CFG_DEFAULT_ABS_PATH}'. Exiting 1 ...") | ||||||
| @@ -118,7 +123,8 @@ def validate_default_section(config_obj: configparser.ConfigParser()) -> None: | |||||||
|         log.debug(f"No defaults defined") |         log.debug(f"No defaults defined") | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def config_has_valid_section(config_obj: configparser.ConfigParser()) -> bool: | def config_has_valid_section( | ||||||
|  |         config_obj: configparser.ConfigParser()) -> bool: | ||||||
|     has_valid_section = False |     has_valid_section = False | ||||||
|     for config_obj_section in config_obj.sections(): |     for config_obj_section in config_obj.sections(): | ||||||
|         if set(CONST.CFG_MANDATORY).issubset(config_obj.options(config_obj_section)): |         if set(CONST.CFG_MANDATORY).issubset(config_obj.options(config_obj_section)): | ||||||
| @@ -127,15 +133,18 @@ def config_has_valid_section(config_obj: configparser.ConfigParser()) -> bool: | |||||||
|     return has_valid_section |     return has_valid_section | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def is_default(config_key: str) -> bool: | def is_default( | ||||||
|  |         config_key: str) -> bool: | ||||||
|     return any(config_key in ini_default for ini_default in ini_defaults) |     return any(config_key in ini_default for ini_default in ini_defaults) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def is_same_as_default(config_kv_pair: dict) -> bool: | def is_same_as_default( | ||||||
|  |         config_kv_pair: dict) -> bool: | ||||||
|     return config_kv_pair in ini_defaults |     return config_kv_pair in ini_defaults | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def validate_config_sections(config_obj: configparser.ConfigParser()) -> None: | def validate_config_sections( | ||||||
|  |         config_obj: configparser.ConfigParser()) -> None: | ||||||
|     for this_section in config_obj.sections(): |     for this_section in config_obj.sections(): | ||||||
|         log.debug(print_section_header(this_section)) |         log.debug(print_section_header(this_section)) | ||||||
|         if not set(CONST.CFG_MANDATORY).issubset(config_obj.options(this_section, no_defaults=True)): |         if not set(CONST.CFG_MANDATORY).issubset(config_obj.options(this_section, no_defaults=True)): | ||||||
| @@ -152,22 +161,29 @@ def validate_config_sections(config_obj: configparser.ConfigParser()) -> None: | |||||||
|                 log.debug(f"{kv_prefix} {key} = {config_obj[this_section][key]}") |                 log.debug(f"{kv_prefix} {key} = {config_obj[this_section][key]}") | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def query_string_from_file(filename: str) -> str: | def query_string_from_file( | ||||||
|  |         filename: str) -> str: | ||||||
|     with open(filename, "r") as jsonfile: |     with open(filename, "r") as jsonfile: | ||||||
|         query_string = jsonfile.read() |         query_string = jsonfile.read() | ||||||
|         return query_string |         return query_string | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def get_query_payload(section_name: str, config_obj: configparser.ConfigParser()) -> JSONType: | def get_query_payload( | ||||||
|  |         section_name: str, | ||||||
|  |         config_obj: configparser.ConfigParser()) -> MVWJSONRequest: | ||||||
|     log.debug(f"Generating HTTP POST JSON payload ...") |     log.debug(f"Generating HTTP POST JSON payload ...") | ||||||
|     query = config_obj.get(section_name, "query") |     query = config_obj.get(section_name, "query") | ||||||
|     if query[0] == "@": |     if query[0] == "@": | ||||||
|         query = query.split("@", 1)[1] |         query = query.split("@", 1)[1] | ||||||
|         query = query_string_from_file(query) |         query = query_string_from_file(query) | ||||||
|     return json.loads(query) |     got_query_payload = MVWJSONRequest(**json.loads(query)) | ||||||
|  |     return got_query_payload | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def get_json_response(section_name: str, config_obj: configparser.ConfigParser(), payload: JSONType) -> JSONType: | def get_json_response( | ||||||
|  |         section_name: str, | ||||||
|  |         config_obj: configparser.ConfigParser(), | ||||||
|  |         payload: MVWJSONRequest) -> MVWJSONResponse: | ||||||
|     log.debug(f"Downloading JSON list of Mediathek files that match search criteria") |     log.debug(f"Downloading JSON list of Mediathek files that match search criteria") | ||||||
|     serialized_payload = json.dumps(payload) |     serialized_payload = json.dumps(payload) | ||||||
|     url = config_obj.get(section_name, "mvw_endpoint") |     url = config_obj.get(section_name, "mvw_endpoint") | ||||||
| @@ -181,19 +197,24 @@ def get_json_response(section_name: str, config_obj: configparser.ConfigParser() | |||||||
|               f"""{newline.join(f"Header '{header}': '{value}'" for header, value in list(req.headers.items()))}\n""" |               f"""{newline.join(f"Header '{header}': '{value}'" for header, value in list(req.headers.items()))}\n""" | ||||||
|               f"Payload: {payload}") |               f"Payload: {payload}") | ||||||
|     with s.send(prepped) as s: |     with s.send(prepped) as s: | ||||||
|         return json.loads(s.content) |         # return json.loads(s.content) | ||||||
|  |         got_json_response = MVWJSONResponse(**json.loads(s.content)) | ||||||
|  |         return got_json_response | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def filter_json_by_duration(section_name: str, config_obj: configparser.ConfigParser(), json_obj: JSONType) -> JSONType: | def filter_json_by_duration( | ||||||
|  |         section_name: str, | ||||||
|  |         config_obj: configparser.ConfigParser(), | ||||||
|  |         json_obj: MVWJSONResponse) -> MVWJSONResponse: | ||||||
|     min_length = config_obj.getint(section_name, "min_duration") |     min_length = config_obj.getint(section_name, "min_duration") | ||||||
|     if min_length >= 0: |     if min_length >= 0: | ||||||
|         log.debug(f"""Filtering JSON for minimum length of {min_length} {p.plural("second", min_length)}""") |         log.debug(f"""Filtering JSON for minimum length of {min_length} {p.plural("second", min_length)}""") | ||||||
|         # console.print(json_obj["result"]["results"][0]) |         console.log(json_obj) | ||||||
|         for result in json_obj["result"]["results"]: |         #for result in json_obj["result"]["results"]: | ||||||
|             console.log(result) |         #    console.log(result) | ||||||
|             console.log(f"0000000000000000000000") |         #    console.log(f"0000000000000000000000") | ||||||
|             if not result["duration"] >= min_length: |         #    if not result["duration"] >= min_length: | ||||||
|                 pass |         #        pass | ||||||
|                 # json_str. |                 # json_str. | ||||||
|                 # console.log(f"{result}\n......................") |                 # console.log(f"{result}\n......................") | ||||||
|         # console.log(json_obj) |         # console.log(json_obj) | ||||||
| @@ -217,6 +238,8 @@ if __name__ == '__main__': | |||||||
|         log.debug(f"Processing section '[{section}]' ...") |         log.debug(f"Processing section '[{section}]' ...") | ||||||
|         query_payload = get_query_payload(section, config) |         query_payload = get_query_payload(section, config) | ||||||
|         json_response = get_json_response(section, config, query_payload) |         json_response = get_json_response(section, config, query_payload) | ||||||
|  |         log.debug(json_response) | ||||||
|  |         quit() | ||||||
|         log.debug(CONST.CFG_KNOWN_SECTION[0]) |         log.debug(CONST.CFG_KNOWN_SECTION[0]) | ||||||
|         if config.has_option(section, "min_duration") or config.has_option(section, "max_duration"): |         if config.has_option(section, "min_duration") or config.has_option(section, "max_duration"): | ||||||
|             json_matches_duration = filter_json_by_duration(section, config, json_response) |             json_matches_duration = filter_json_by_duration(section, config, json_response) | ||||||
| @@ -1,3 +1,4 @@ | |||||||
| rich | rich | ||||||
| requests | requests | ||||||
| inflect | inflect | ||||||
|  | pydantic | ||||||
| @@ -14,11 +14,15 @@ idna==3.3 | |||||||
|     # via requests |     # via requests | ||||||
| inflect==5.4.0 | inflect==5.4.0 | ||||||
|     # via -r requirements.in |     # via -r requirements.in | ||||||
|  | pydantic==1.9.0 | ||||||
|  |     # via -r requirements.in | ||||||
| pygments==2.11.2 | pygments==2.11.2 | ||||||
|     # via rich |     # via rich | ||||||
| requests==2.27.1 | requests==2.27.1 | ||||||
|     # via -r requirements.in |     # via -r requirements.in | ||||||
| rich==12.0.0 | rich==12.0.0 | ||||||
|     # via -r requirements.in |     # via -r requirements.in | ||||||
|  | typing-extensions==4.1.1 | ||||||
|  |     # via pydantic | ||||||
| urllib3==1.26.8 | urllib3==1.26.8 | ||||||
|     # via requests |     # via requests | ||||||
							
								
								
									
										0
									
								
								type_def/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								type_def/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										17
									
								
								type_def/mvw_json_request.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								type_def/mvw_json_request.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | |||||||
|  | from __future__ import annotations | ||||||
|  | from typing import List | ||||||
|  | from pydantic import BaseModel | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Query(BaseModel): | ||||||
|  |     fields: List[str] | ||||||
|  |     query: str | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class MVWJSONRequest(BaseModel): | ||||||
|  |     queries: List[Query] | ||||||
|  |     sortBy: str | ||||||
|  |     sortOrder: str | ||||||
|  |     future: bool | ||||||
|  |     offset: int | ||||||
|  |     size: int | ||||||
							
								
								
									
										37
									
								
								type_def/mvw_json_response.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								type_def/mvw_json_response.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | from __future__ import annotations | ||||||
|  | from typing import List, Optional | ||||||
|  | from pydantic import BaseModel | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Show(BaseModel): | ||||||
|  |     channel: str | ||||||
|  |     topic: str | ||||||
|  |     title: str | ||||||
|  |     description: str | ||||||
|  |     timestamp: int | ||||||
|  |     duration: int | ||||||
|  |     size: int | ||||||
|  |     url_website: str | ||||||
|  |     url_subtitle: str | ||||||
|  |     url_video: str | ||||||
|  |     url_video_low: str | ||||||
|  |     url_video_hd: str | ||||||
|  |     filmlisteTimestamp: str | ||||||
|  |     id: str | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class QueryInfo(BaseModel): | ||||||
|  |     filmlisteTimestamp: str | ||||||
|  |     searchEngineTime: str | ||||||
|  |     resultCount: int | ||||||
|  |     totalResults: int | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Result(BaseModel): | ||||||
|  |     results: List[Show] = [] | ||||||
|  |     queryInfo: QueryInfo | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class MVWJSONResponse(BaseModel): | ||||||
|  |     result: Result | ||||||
|  |     err: Optional[str] = None | ||||||
		Reference in New Issue
	
	Block a user