2022-02-26 09:35:58 +00:00
|
|
|
import typing as t
|
|
|
|
|
|
|
|
from . import BasePipedModel
|
|
|
|
|
|
|
|
|
|
|
|
class Comments(BasePipedModel):
|
|
|
|
class Comment(BasePipedModel):
|
|
|
|
@property
|
|
|
|
def author(self) -> str:
|
|
|
|
"""
|
|
|
|
The name of the author of the comment
|
|
|
|
"""
|
|
|
|
|
|
|
|
return self.data['author']
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
def comment_id(self) -> str:
|
|
|
|
"""
|
|
|
|
The comment ID
|
|
|
|
"""
|
|
|
|
|
|
|
|
return self.data['commentId']
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
def comment_text(self) -> str:
|
|
|
|
"""
|
|
|
|
The text of the comment
|
|
|
|
"""
|
|
|
|
|
|
|
|
return self.data['commentText']
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
def commented_time(self) -> str:
|
|
|
|
"""
|
2022-02-26 14:32:37 +00:00
|
|
|
The time the comment was made (format: `'x y ago'`).
|
|
|
|
|
|
|
|
### Note:
|
|
|
|
The raw time from API also includes the `'(edited)'` suffix to mark comment as edited (if it was).
|
|
|
|
By accessing this property, the suffix is automatically removed.
|
|
|
|
If you for whatever reason want to keep the suffix, access this property directly via `Comment.data['commentedTime']`
|
|
|
|
"""
|
|
|
|
|
|
|
|
time: str = self.data['commentedTime']
|
|
|
|
|
|
|
|
return time.removesuffix(' (edited)')
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
def is_edited(self) -> bool:
|
2022-02-26 09:35:58 +00:00
|
|
|
"""
|
2022-02-26 14:32:37 +00:00
|
|
|
Whether or not the comment is edited.
|
|
|
|
|
|
|
|
### Note:
|
|
|
|
This property checks whether there is `'(edited)'` in the `commentedTime` property, because that's where you get that from.
|
|
|
|
See `Comments.Comment.commented_time`
|
|
|
|
"""
|
|
|
|
|
|
|
|
time: str = self.data['commentedTime']
|
2022-02-26 09:35:58 +00:00
|
|
|
|
2022-02-26 14:32:37 +00:00
|
|
|
return time.endswith('(edited)')
|
2022-02-26 09:35:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
def commentor_url(self) -> str:
|
|
|
|
"""
|
|
|
|
The URL of the channel that made the comment
|
|
|
|
"""
|
|
|
|
|
|
|
|
return self.data['commentorUrl']
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
def replies_page(self) -> t.Optional[str]:
|
|
|
|
"""
|
|
|
|
Same as `Comments.nextpage`, but to load replies.
|
|
|
|
|
|
|
|
`None` means that there are no replies.
|
|
|
|
"""
|
|
|
|
|
|
|
|
return self.data['repliesPage']
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
def hearted(self) -> bool:
|
|
|
|
"""
|
|
|
|
Whether or not the comment has been hearted
|
|
|
|
"""
|
|
|
|
|
|
|
|
return self.data['hearted']
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
def like_count(self) -> int:
|
|
|
|
"""
|
|
|
|
The number of likes the comment has
|
|
|
|
"""
|
|
|
|
|
|
|
|
return self.data['likeCount']
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
def pinned(self) -> bool:
|
|
|
|
"""
|
|
|
|
Whether or not the comment is pinned
|
|
|
|
"""
|
|
|
|
|
|
|
|
return self.data['pinned']
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
def thumbnail(self) -> str:
|
|
|
|
"""
|
|
|
|
The thumbnail of the commentor's channel
|
|
|
|
"""
|
|
|
|
|
|
|
|
return self.data['thumbnail']
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
def verified(self) -> bool:
|
|
|
|
"""
|
|
|
|
Whether or not the author of the comment is verified
|
|
|
|
"""
|
|
|
|
|
|
|
|
return self.data['verified']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_comments(self) -> t.List[Comment]:
|
|
|
|
"""
|
|
|
|
Obtain a list of comments
|
|
|
|
"""
|
|
|
|
|
|
|
|
return [self.Comment(comment_json) for comment_json in self.data['comments']]
|
|
|
|
|
|
|
|
|
|
|
|
def __iter__(self) -> t.Iterator[Comment]:
|
|
|
|
iter(self.get_comments())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
def disabled(self) -> bool:
|
|
|
|
"""
|
|
|
|
Whether or not the comments are disabled
|
|
|
|
"""
|
|
|
|
|
|
|
|
return self.data['disabled']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
def nextpage(self) -> t.Optional[str]:
|
|
|
|
"""
|
|
|
|
A JSON encoded page, which is used for the nextpage endpoint.
|
|
|
|
|
|
|
|
If there is no nextpage data, this returns `None`.
|
|
|
|
"""
|
|
|
|
|
|
|
|
return self.data['nextpage']
|