Compare commits

..

8 Commits

Author SHA1 Message Date
taizan-hokuto
9de75788f2 Merge branch 'hotfix/cannot_fetch_at_0_multithread' 2020-02-01 01:41:40 +09:00
taizan-hokuto
76f0c0e658 Increment version 2020-02-01 01:36:35 +09:00
taizan-hokuto
0d8ecb778f Fix for #1 : core_multithread 2020-02-01 01:25:42 +09:00
taizan-hokuto
bbf7a2906a Merge branch 'hotfix/cannot_fetch_at_0' 2020-02-01 00:01:04 +09:00
taizan-hokuto
1862b83eac Increment version 2020-01-31 23:58:07 +09:00
taizan-hokuto
053ff5291f Modify url for japanese wiki 2020-01-31 23:54:03 +09:00
taizan-hokuto
4e47d4a262 Fix for #1 2020-01-31 23:38:51 +09:00
taizan-hokuto
956c7e2640 Update README.md 2020-01-18 17:50:31 +09:00
5 changed files with 33 additions and 8 deletions

View File

@@ -16,7 +16,7 @@ Other features:
instead of web scraping.
For more detailed information, see [wiki](https://github.com/taizan-hokuto/pytchat/wiki). <br>
より詳細な解説は[wiki](https://github.com/taizan-hokuto/pytchat/wiki/Home-:)を参照してください。
より詳細な解説は[wiki](https://github.com/taizan-hokuto/pytchat/wiki/Home_jp)を参照してください。
## Install
```python
@@ -267,4 +267,4 @@ Structure of author object.
[taizan-hokuto](https://github.com/taizan-hokuto)
[twitter:@taizan205](https://twitter.com/taizan205)
[twitter:@taizan205](https://twitter.com/taizan205)

View File

@@ -2,7 +2,7 @@
pytchat is a python library for fetching youtube live chat without using yt api, Selenium, or BeautifulSoup.
"""
__copyright__ = 'Copyright (C) 2019 taizan-hokuto'
__version__ = '0.0.5.1.3'
__version__ = '0.0.5.3'
__license__ = 'MIT'
__author__ = 'taizan-hokuto'
__author_email__ = '55448286+taizan-hokuto@users.noreply.github.com'

View File

@@ -73,7 +73,6 @@ class LiveChatAsync:
'''
_setup_finished = False
_logger = config.logger(__name__)
def __init__(self, video_id,
seektime = 0,
@@ -233,6 +232,11 @@ class LiveChatAsync:
self.video_id, self.seektime, self._topchat_only)
livechat_json = (await self._get_livechat_json(
continuation, session, headers))
reload_continuation = self._parser.reload_continuation(
self._parser.get_contents(livechat_json))
if reload_continuation:
livechat_json = (await self._get_livechat_json(
reload_continuation, session, headers))
contents = self._parser.get_contents(livechat_json)
self._first_fetch = False
return contents
@@ -244,8 +248,7 @@ class LiveChatAsync:
continuation = urllib.parse.quote(continuation)
livechat_json = None
status_code = 0
url =(
f"https://www.youtube.com/{self._fetch_url}{continuation}&pbj=1")
url =f"https://www.youtube.com/{self._fetch_url}{continuation}&pbj=1"
for _ in range(MAX_RETRY + 1):
async with session.get(url ,headers = headers) as resp:
try:

View File

@@ -74,7 +74,6 @@ class LiveChat:
_setup_finished = False
#チャット監視中のListenerのリスト
_listeners = []
_logger = config.logger(__name__)
def __init__(self, video_id,
seektime = 0,
@@ -222,9 +221,15 @@ class LiveChat:
'''Try to fetch archive chat data.'''
self._parser.is_replay = True
self._fetch_url = "live_chat_replay/get_live_chat_replay?continuation="
continuation = arcparam.getparam(self.video_id, self.seektime)
continuation = arcparam.getparam(
self.video_id, self.seektime, self._topchat_only)
livechat_json = ( self._get_livechat_json(
continuation, session, headers))
reload_continuation = self._parser.reload_continuation(
self._parser.get_contents(livechat_json))
if reload_continuation:
livechat_json = (self._get_livechat_json(
reload_continuation, session, headers))
contents = self._parser.get_contents(livechat_json)
self._first_fetch = False
return contents

View File

@@ -66,6 +66,23 @@ class Parser:
raise ChatParseException('Cannot extract continuation data')
return self._create_data(metadata, contents)
def reload_continuation(self, contents):
"""
When `seektime = 0` or seektime is abbreviated ,
check if fetched chat json has no chat data.
If so, try to fetch playerSeekContinuationData.
This function must be run only first fetching.
"""
cont = contents['liveChatContinuation']['continuations'][0]
if cont.get("liveChatReplayContinuationData"):
#chat data exist.
return None
#chat data do not exist, get playerSeekContinuationData.
init_cont = cont.get("playerSeekContinuationData")
if init_cont:
return init_cont.get("continuation")
raise ChatParseException('Finished chat data')
def _create_data(self, metadata, contents):
actions = contents['liveChatContinuation'].get('actions')
if self.is_replay: