Merge branch 'develop'
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
pytchat is a lightweight python library to browse youtube livechat without Selenium or BeautifulSoup.
|
pytchat is a lightweight python library to browse youtube livechat without Selenium or BeautifulSoup.
|
||||||
"""
|
"""
|
||||||
__copyright__ = 'Copyright (C) 2019, 2020 taizan-hokuto'
|
__copyright__ = 'Copyright (C) 2019, 2020 taizan-hokuto'
|
||||||
__version__ = '0.5.3'
|
__version__ = '0.5.4'
|
||||||
__license__ = 'MIT'
|
__license__ = 'MIT'
|
||||||
__author__ = 'taizan-hokuto'
|
__author__ = 'taizan-hokuto'
|
||||||
__author_email__ = '55448286+taizan-hokuto@users.noreply.github.com'
|
__author_email__ = '55448286+taizan-hokuto@users.noreply.github.com'
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ from base64 import a85decode as dc
|
|||||||
headers = {
|
headers = {
|
||||||
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63,gzip(gfe)',
|
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63,gzip(gfe)',
|
||||||
}
|
}
|
||||||
|
m_headers = {
|
||||||
|
'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Mobile Safari/537.36 Edg/91.0.864.59',
|
||||||
|
}
|
||||||
_sml = dc(b"BQS?8F#ks-GB\\6`H#IhIF^eo7@rH3;H#IhIF^eor06T''Ch\\'(?XmbXF>%9<FC/iuG%G#jBOQ!ICLqcS5tQB2;gCZ)?UdXC;f$GR3)MM2<(0>O7mh!,G@+K5?SO9T@okV").decode()
|
_sml = dc(b"BQS?8F#ks-GB\\6`H#IhIF^eo7@rH3;H#IhIF^eor06T''Ch\\'(?XmbXF>%9<FC/iuG%G#jBOQ!ICLqcS5tQB2;gCZ)?UdXC;f$GR3)MM2<(0>O7mh!,G@+K5?SO9T@okV").decode()
|
||||||
_smr = dc(b"BQS?8F#ks-GB\\6`H#IhIF^eo7@rH3;H#IhIF^eor06T''Ch\\'(?XmbXF>%9<FC/iuG%G#jBOQ!iEb03+@<k(QAU-F)8U=fDGsP557S5F7CiNH7;)D3N77^*B6YU@\\?WfBr0emZX=#^").decode()
|
_smr = dc(b"BQS?8F#ks-GB\\6`H#IhIF^eo7@rH3;H#IhIF^eor06T''Ch\\'(?XmbXF>%9<FC/iuG%G#jBOQ!iEb03+@<k(QAU-F)8U=fDGsP557S5F7CiNH7;)D3N77^*B6YU@\\?WfBr0emZX=#^").decode()
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ PATTERN_YTURL = re.compile(r"((?<=(v|V)/)|(?<=be/)|(?<=(\?|\&)v=)|(?<=embed/))([
|
|||||||
|
|
||||||
PATTERN_CHANNEL = re.compile(r"\\\"channelId\\\":\\\"(.{24})\\\"")
|
PATTERN_CHANNEL = re.compile(r"\\\"channelId\\\":\\\"(.{24})\\\"")
|
||||||
|
|
||||||
|
PATTERN_M_CHANNEL = re.compile(r"\"channelId\":\"(.{24})\"")
|
||||||
|
|
||||||
YT_VIDEO_ID_LENGTH = 11
|
YT_VIDEO_ID_LENGTH = 11
|
||||||
|
|
||||||
CLIENT_VERSION = ''.join(("2.", (datetime.datetime.today() - datetime.timedelta(days=1)).strftime("%Y%m%d"), ".01.00"))
|
CLIENT_VERSION = ''.join(("2.", (datetime.datetime.today() - datetime.timedelta(days=1)).strftime("%Y%m%d"), ".01.00"))
|
||||||
@@ -100,6 +102,19 @@ def extract_video_id(url_or_id: str) -> str:
|
|||||||
def get_channelid(client, video_id):
|
def get_channelid(client, video_id):
|
||||||
resp = client.get("https://www.youtube.com/embed/{}".format(quote(video_id)), headers=config.headers)
|
resp = client.get("https://www.youtube.com/embed/{}".format(quote(video_id)), headers=config.headers)
|
||||||
match = re.search(PATTERN_CHANNEL, resp.text)
|
match = re.search(PATTERN_CHANNEL, resp.text)
|
||||||
|
try:
|
||||||
|
if match is None:
|
||||||
|
raise IndexError
|
||||||
|
ret = match.group(1)
|
||||||
|
except IndexError:
|
||||||
|
ret = get_channelid_2nd(client, video_id)
|
||||||
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
def get_channelid_2nd(client, video_id):
|
||||||
|
resp = client.get("https://m.youtube.com/watch?v={}".format(quote(video_id)), headers=config.m_headers)
|
||||||
|
|
||||||
|
match = re.search(PATTERN_M_CHANNEL, resp.text)
|
||||||
if match is None:
|
if match is None:
|
||||||
raise InvalidVideoIdException(f"Cannot find channel id for video id:{video_id}. This video id seems to be invalid.")
|
raise InvalidVideoIdException(f"Cannot find channel id for video id:{video_id}. This video id seems to be invalid.")
|
||||||
try:
|
try:
|
||||||
@@ -108,9 +123,21 @@ def get_channelid(client, video_id):
|
|||||||
raise InvalidVideoIdException(f"Invalid video id: {video_id}")
|
raise InvalidVideoIdException(f"Invalid video id: {video_id}")
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
async def get_channelid_async(client, video_id):
|
async def get_channelid_async(client, video_id):
|
||||||
resp = await client.get("https://www.youtube.com/embed/{}".format(quote(video_id)), headers=config.headers)
|
resp = await client.get("https://www.youtube.com/embed/{}".format(quote(video_id)), headers=config.headers)
|
||||||
match = re.search(PATTERN_CHANNEL, resp.text)
|
match = re.search(PATTERN_CHANNEL, resp.text)
|
||||||
|
try:
|
||||||
|
if match is None:
|
||||||
|
raise IndexError
|
||||||
|
ret = match.group(1)
|
||||||
|
except IndexError:
|
||||||
|
ret = await get_channelid_async_2nd(client, video_id)
|
||||||
|
return ret
|
||||||
|
|
||||||
|
async def get_channelid_async_2nd(client, video_id):
|
||||||
|
resp = await client.get("https://m.youtube.com/watch?v={}".format(quote(video_id)), headers=config.m_headers)
|
||||||
|
match = re.search(PATTERN_M_CHANNEL, resp.text)
|
||||||
if match is None:
|
if match is None:
|
||||||
raise InvalidVideoIdException(f"Cannot find channel id for video id:{video_id}. This video id seems to be invalid.")
|
raise InvalidVideoIdException(f"Cannot find channel id for video id:{video_id}. This video id seems to be invalid.")
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user