Skip to content

Commit 8f366a2

Browse files
authored
Update requesthandler.py
1 parent 44f9039 commit 8f366a2

1 file changed

Lines changed: 32 additions & 39 deletions

File tree

Lines changed: 32 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,63 @@
11
from urllib.request import Request, urlopen
2+
from urllib.error import URLError, HTTPError
23
from urllib.parse import urlencode
34
import json
45
import copy
5-
from youtubesearchpython.handlers.componenthandler import ComponentHandler
6+
from youtubesearchpython.core.componenthandler import ComponentHandler
67
from youtubesearchpython.core.constants import *
8+
from youtubesearchpython.core.exceptions import YouTubeRequestError, YouTubeParseError
79

810

911
class RequestHandler(ComponentHandler):
1012
def _makeRequest(self) -> None:
13+
''' Fixes #47 '''
1114
requestBody = copy.deepcopy(requestPayload)
12-
requestBody['query'] = self.query or ''
13-
context = requestBody.setdefault('context', {})
14-
client = context.setdefault('client', {})
15-
client.update({
16-
'hl': self.language or client.get('hl'),
17-
'gl': self.region or client.get('gl'),
18-
})
15+
requestBody['query'] = self.query
16+
requestBody['client'] = {
17+
'hl': self.language,
18+
'gl': self.region,
19+
}
1920
if self.searchPreferences:
2021
requestBody['params'] = self.searchPreferences
2122
if self.continuationKey:
2223
requestBody['continuation'] = self.continuationKey
23-
24-
if not searchKey:
25-
raise Exception('INNERTUBE API key (searchKey) is not set.')
26-
27-
requestBodyBytes = json.dumps(requestBody).encode('utf-8')
28-
url = 'https://www.youtube.com/youtubei/v1/search' + '?' + urlencode({'key': searchKey})
24+
requestBodyBytes = json.dumps(requestBody).encode('utf_8')
2925
request = Request(
30-
url,
31-
data=requestBodyBytes,
32-
headers={
26+
'https://www.youtube.com/youtubei/v1/search' + '?' + urlencode({
27+
'key': searchKey,
28+
}),
29+
data = requestBodyBytes,
30+
headers = {
3331
'Content-Type': 'application/json; charset=utf-8',
32+
'Content-Length': len(requestBodyBytes),
3433
'User-Agent': userAgent,
3534
}
3635
)
3736
try:
38-
self.response = urlopen(request, timeout=self.timeout).read().decode('utf-8')
37+
self.response = urlopen(request, timeout=self.timeout).read().decode('utf_8')
38+
except (URLError, HTTPError, TimeoutError) as e:
39+
raise YouTubeRequestError(f'Failed to make request: {str(e)}')
3940
except Exception as e:
40-
raise Exception('ERROR: Could not make request.') from e
41-
41+
raise YouTubeRequestError(f'Unexpected error making request: {str(e)}')
42+
4243
def _parseSource(self) -> None:
4344
try:
44-
data = json.loads(self.response)
4545
if not self.continuationKey:
46-
responseContent = self._getValue(data, contentPath)
46+
responseContent = self._getValue(json.loads(self.response), contentPath)
4747
else:
48-
responseContent = self._getValue(data, continuationContentPath)
49-
48+
responseContent = self._getValue(json.loads(self.response), continuationContentPath)
5049
if responseContent:
5150
for element in responseContent:
52-
if itemSectionKey in element:
51+
if itemSectionKey in element.keys():
5352
self.responseSource = self._getValue(element, [itemSectionKey, 'contents'])
54-
if continuationItemKey in element:
53+
if continuationItemKey in element.keys():
5554
self.continuationKey = self._getValue(element, continuationKeyPath)
5655
else:
57-
fallback = self._getValue(data, fallbackContentPath)
58-
if fallback:
59-
self.responseSource = fallback
60-
# attempt to set continuationKey from the last element if present there was url failing like for tracks like pal pal afusic
61-
try:
62-
last = self.responseSource[-1]
63-
self.continuationKey = self._getValue(last, continuationKeyPath)
64-
except Exception:
65-
self.continuationKey = None
66-
else:
67-
self.responseSource = []
68-
self.continuationKey = None
56+
self.responseSource = self._getValue(json.loads(self.response), fallbackContentPath)
57+
self.continuationKey = self._getValue(self.responseSource[-1], continuationKeyPath)
58+
except json.JSONDecodeError as e:
59+
raise YouTubeParseError(f'Failed to parse JSON response: {str(e)}')
60+
except KeyError as e:
61+
raise YouTubeParseError(f'Missing expected key in response: {str(e)}')
6962
except Exception as e:
70-
raise Exception('ERROR: Could not parse YouTube response.') from e
63+
raise YouTubeParseError(f'Failed to parse YouTube response: {str(e)}')

0 commit comments

Comments
 (0)