# -*- coding: utf-8 -*-
from datetime import datetime
from typing import (
Optional,
Union
)
from warnings import warn
from .exception import auto_raise, APIServerResponseWarning, APIServerResponseError
[docs]def response_json_stripper(
parsed_json_dict: dict,
silent: bool = False,
raise_message = False
) -> Optional[dict]:
"""General parser for normalize response data format of json.
This parses result and deletes response code. Also strip "data" field when dealing with membership response.
Arguments:
parsed_json_dict (:class:`dict`) : Loaded json data to normalize.
silent (:class:`bool`, optional) : Return None instead of raising exception, defaults to False.
raise_message (:class:`bool`, optional) : Raise exception instead of warning, defaults to False.
Returns:
:class:`dict`. Parsed json data
"""
# if data has success code
if "code" in parsed_json_dict:
if "result" in parsed_json_dict:
parsed_json_dict = parsed_json_dict['result']
else:
parsed_json_dict = {}
# if data has error code
elif 'errorCode' in parsed_json_dict:
err_tuple = (parsed_json_dict['errorCode'], parsed_json_dict['message'].replace("\n", " "))
if 'data' in parsed_json_dict:
if not silent:
if raise_message:
raise APIServerResponseError('[%s] %s' % err_tuple)
else:
warn("Response has error [%s] %s" % err_tuple, APIServerResponseWarning)
parsed_json_dict = parsed_json_dict['data']
else:
auto_raise(APIServerResponseError('[%s] %s' % err_tuple), silent=silent)
return None
# if data has data field (Membership)
if "data" in parsed_json_dict and len(parsed_json_dict) == 1:
parsed_json_dict = parsed_json_dict["data"]
return parsed_json_dict
[docs]def next_page_checker(
page: dict
) -> Optional[str]:
"""This is the parser for checking "nextParams" from react page data for automatic paging in get*Iter function.
Arguments:
page (:class:`dict`) : Page data from get(Comments, Posts, etc..)
Returns:
:class:`str`. "after" parameter for paging. This returns None if response doesn't have "nextParams"
"""
if 'nextParams' in page['paging']:
return page['paging']['nextParams']['after']
else:
return None
[docs]def max_res_from_play_info(
play_info: dict
) -> dict:
"""This is the parser for finding maximum resolution from play info (FVideo, VOD).
Arguments:
play_info (:class:`dict`) : Play info dict to find maximum resolution.
Returns:
:class:`dict`. Video data that has maximum resolution from play_info
"""
vl = play_info['videos']['list']
sorted_res = sorted(vl, key=lambda x: x['bitrate']['video'], reverse=True)
return sorted_res[0]
[docs]def v_timestamp_parser(
ts: Union[str, int]
) -> float:
"""This is the function for parsing VLIVE timeunit(microsecond epoch) to float second.
Arguments:
ts (:class:`Union[str, int]`) : VLIVE epoch time to parse.
Returns:
:class:`float`. parsed epoch.
"""
str_ts = str(ts)
return float("%s.%s" % (str_ts[:-3], str_ts[-3:]))