<s> from __future__ import unicode_literals <EOL> import json <EOL> from . common import InfoExtractor <EOL> from . . compat import ( <EOL> compat_urllib_request , <EOL> ) <EOL> from . . utils import ( <EOL> int_or_none , <EOL> ) <EOL> class PornotubeIE ( InfoExtractor ) : <EOL> _VALID_URL = r'<STR_LIT>' <EOL> _TEST = { <EOL> '<STR_LIT:url>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : { <EOL> '<STR_LIT:id>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT:title>' : '<STR_LIT>' , <EOL> '<STR_LIT:description>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : [ '<STR_LIT>' , '<STR_LIT>' ] , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> '<STR_LIT>' : <NUM_LIT> , <EOL> '<STR_LIT>' : <NUM_LIT> , <EOL> } <EOL> } <EOL> def _real_extract ( self , url ) : <EOL> video_id = self . _match_id ( url ) <EOL> js_config = self . _download_webpage ( <EOL> '<STR_LIT>' , video_id , <EOL> note = '<STR_LIT>' ) <EOL> originAuthenticationSpaceKey = self . _search_regex ( <EOL> r"<STR_LIT>" , <EOL> js_config , '<STR_LIT>' ) <EOL> token_req_data = { <EOL> '<STR_LIT>' : originAuthenticationSpaceKey , <EOL> '<STR_LIT>' : '<STR_LIT>' , <EOL> } <EOL> token_req = compat_urllib_request . Request ( <EOL> '<STR_LIT>' , <EOL> data = json . dumps ( token_req_data ) . encode ( '<STR_LIT:utf-8>' ) ) <EOL> token_req . add_header ( '<STR_LIT:Content-Type>' , '<STR_LIT:application/json>' ) <EOL> token_req . add_header ( '<STR_LIT>' , '<STR_LIT>' ) <EOL> token_answer = self . _download_json ( <EOL> token_req , video_id , note = '<STR_LIT>' ) <EOL> token = token_answer [ '<STR_LIT>' ] <EOL> delivery_req = compat_urllib_request . Request ( <EOL> '<STR_LIT>' % video_id ) <EOL> delivery_req . add_header ( '<STR_LIT>' , token ) <EOL> delivery_info = self . _download_json ( <EOL> delivery_req , video_id , note = '<STR_LIT>' ) <EOL> video_url = delivery_info [ '<STR_LIT>' ] <EOL> info_req = compat_urllib_request . Request ( <EOL> '<STR_LIT>' <EOL> '<STR_LIT>' <EOL> '<STR_LIT>' <EOL> '<STR_LIT>' <EOL> '<STR_LIT>' % video_id ) <EOL> info_req . add_header ( '<STR_LIT>' , token ) <EOL> info = self . _download_json ( <EOL> info_req , video_id , note = '<STR_LIT>' ) <EOL> timestamp = int_or_none ( info . get ( '<STR_LIT>' ) , scale = <NUM_LIT:1000> ) <EOL> uploader = info . get ( '<STR_LIT>' , [ { } ] ) [ <NUM_LIT:0> ] . get ( '<STR_LIT:name>' ) <EOL> movie_id = info [ '<STR_LIT>' ] [ '<STR_LIT>' ] <EOL> thumbnail = '<STR_LIT>' % ( <EOL> movie_id , movie_id , info [ '<STR_LIT>' ] ) <EOL> categories = [ c [ '<STR_LIT:name>' ] for c in info . get ( '<STR_LIT>' ) ] <EOL> return { <EOL> '<STR_LIT:id>' : video_id , <EOL> '<STR_LIT:url>' : video_url , <EOL> '<STR_LIT:title>' : info [ '<STR_LIT:title>' ] , <EOL> '<STR_LIT:description>' : info . get ( '<STR_LIT:description>' ) , <EOL> '<STR_LIT>' : timestamp , <EOL> '<STR_LIT>' : uploader , <EOL> '<STR_LIT>' : thumbnail , <EOL> '<STR_LIT>' : categories , <EOL> '<STR_LIT>' : <NUM_LIT> , <EOL> } </s>
