From c0366db87697fee942de8e33305406aa6db688f2 Mon Sep 17 00:00:00 2001 From: mytja Date: Wed, 19 Jan 2022 11:09:09 +0100 Subject: [PATCH 1/2] Add comments --- README.md | 39 ++++ asyncExample.py | 13 ++ syncExample.py | 9 + youtubesearchpython/__future__/README.md | 38 ++++ youtubesearchpython/__future__/__init__.py | 2 +- youtubesearchpython/__future__/extras.py | 26 +++ youtubesearchpython/__init__.py | 2 +- youtubesearchpython/core/comments.py | 204 +++++++++++++++++++++ youtubesearchpython/extras.py | 36 +++- 9 files changed, 362 insertions(+), 7 deletions(-) create mode 100644 youtubesearchpython/core/comments.py diff --git a/README.md b/README.md index f316b42..95b68a8 100644 --- a/README.md +++ b/README.md @@ -1381,6 +1381,45 @@ print(url) +#### Get comments of a video +You can use a Comments class for that. +```python +from youtubesearchpython import * + +# You can either pass an ID or a URL +video_id = "_ZdsmLgCVdU" +comments = Comments(video_id) + +print(f'Comments Retrieved: {len(comments.comments["result"])}') + +while comments.hasMoreComments: + print('Getting more comments...') + comments.getNextComments() + print(f'Comments Retrieved: {len(comments.comments["result"])}') + +print('Found all the comments.') +``` + +
+ Example Result + +```bash +Videos Retrieved: 20 +Getting more videos... +Videos Retrieved: 40 +Getting more videos... +Videos Retrieved: 60 +Getting more videos... +Videos Retrieved: 80 +Getting more videos... +Videos Retrieved: 100 +Getting more videos... +... +``` + +
+ + ## License MIT License diff --git a/asyncExample.py b/asyncExample.py index 32e7bd6..8cbeef2 100644 --- a/asyncExample.py +++ b/asyncExample.py @@ -199,6 +199,19 @@ async def main(): + comments = Comments("_ZdsmLgCVdU") + + await comments.getNextComments() + print(len(comments.comments["result"])) + + while len(comments.comments["result"]) < 100: + await comments.getNextComments() + print(len(comments.comments["result"])) + print("Found all comments") + + + + ''' You may add/omit the optional parameters according to your requirement & use case. ''' diff --git a/syncExample.py b/syncExample.py index cdfa1e5..4b177d0 100644 --- a/syncExample.py +++ b/syncExample.py @@ -201,6 +201,15 @@ +comments = Comments("_ZdsmLgCVdU") + +print(len(comments.comments["result"])) + +while len(comments.comments["result"]) < 100: + comments.getNextComments() + print(len(comments.comments["result"])) +print("Found all comments") + ''' You may add/omit the optional parameters according to your requirement & use case. diff --git a/youtubesearchpython/__future__/README.md b/youtubesearchpython/__future__/README.md index d4b0ad7..40753db 100644 --- a/youtubesearchpython/__future__/README.md +++ b/youtubesearchpython/__future__/README.md @@ -1099,6 +1099,44 @@ print(url) +#### Get comments of a video +You can use a Comments class for that. +```python +from youtubesearchpython.__future__ import * + +# You can either pass an ID or a URL +video_id = "_ZdsmLgCVdU" +comments = Comments(video_id) + +# Important to query before retrieving comments +await comments.getNextComments() +print(f'Comments Retrieved: {len(comments.comments["result"])}') + +while comments.hasMoreComments: + print('Getting more comments...') + await comments.getNextComments() + print(f'Comments Retrieved: {len(comments.comments["result"])}') + +print('Found all the comments.') +``` + +
+ Example Result + +```bash +Videos Retrieved: 20 +Getting more videos... +Videos Retrieved: 40 +Getting more videos... +Videos Retrieved: 60 +Getting more videos... +Videos Retrieved: 80 +Getting more videos... +Videos Retrieved: 100 +Getting more videos... +... +``` + ## Dependencies - Thanks to [Encode](https://github.com/encode) for [httpx](https://github.com/encode/httpx). diff --git a/youtubesearchpython/__future__/__init__.py b/youtubesearchpython/__future__/__init__.py index b2e8ef3..4d24b64 100644 --- a/youtubesearchpython/__future__/__init__.py +++ b/youtubesearchpython/__future__/__init__.py @@ -1,5 +1,5 @@ from youtubesearchpython.__future__.search import Search, VideosSearch, ChannelsSearch, PlaylistsSearch, CustomSearch, ChannelSearch -from youtubesearchpython.__future__.extras import Video, Playlist, Suggestions, Hashtag +from youtubesearchpython.__future__.extras import Video, Playlist, Suggestions, Hashtag, Comments from youtubesearchpython.__future__.streamurlfetcher import StreamURLFetcher from youtubesearchpython.core.utils import * from youtubesearchpython.core.constants import * diff --git a/youtubesearchpython/__future__/extras.py b/youtubesearchpython/__future__/extras.py index 99e80ac..7c23bc7 100644 --- a/youtubesearchpython/__future__/extras.py +++ b/youtubesearchpython/__future__/extras.py @@ -2,6 +2,7 @@ from typing import Union from youtubesearchpython.core import VideoCore +from youtubesearchpython.core.comments import CommentsCore from youtubesearchpython.core.constants import ResultMode from youtubesearchpython.core.hashtag import HashtagCore from youtubesearchpython.core.playlist import PlaylistCore @@ -1839,3 +1840,28 @@ async def next(self) -> dict: return { 'result': self.resultComponents, } + + +class Comments: + comments = [] + hasMoreComments = True + __comments = None + + def __init__(self, playlistLink: str, timeout: int = None): + self.timeout = timeout + self.playlistLink = playlistLink + + async def getNextComments(self) -> None: + if self.__comments is None: + self.__comments = CommentsCore(self.playlistLink) + await self.__comments.async_create() + else: + await self.__comments.async_create_next() + self.comments = self.__comments.commentsComponent + self.hasMoreComments = self.__comments.continuationKey is not None + + @staticmethod + async def get(playlistLink: str) -> Union[dict, str, None]: + pc = CommentsCore(playlistLink) + await pc.async_create() + return pc.commentsComponent diff --git a/youtubesearchpython/__init__.py b/youtubesearchpython/__init__.py index 34c1732..b5fa9b7 100644 --- a/youtubesearchpython/__init__.py +++ b/youtubesearchpython/__init__.py @@ -1,5 +1,5 @@ from youtubesearchpython.search import Search, VideosSearch, ChannelsSearch, PlaylistsSearch, CustomSearch, ChannelSearch -from youtubesearchpython.extras import Video, Playlist, Suggestions, Hashtag +from youtubesearchpython.extras import Video, Playlist, Suggestions, Hashtag, Comments from youtubesearchpython.streamurlfetcher import StreamURLFetcher from youtubesearchpython.core.constants import * from youtubesearchpython.core.utils import * diff --git a/youtubesearchpython/core/comments.py b/youtubesearchpython/core/comments.py new file mode 100644 index 0000000..b827f0d --- /dev/null +++ b/youtubesearchpython/core/comments.py @@ -0,0 +1,204 @@ +import collections +import copy +import itertools +import json +from typing import Iterable, Mapping, Tuple, TypeVar, Union, List +from urllib.parse import urlencode +from urllib.request import Request, urlopen + +from youtubesearchpython.core.componenthandler import getVideoId, getValue +from youtubesearchpython.core.constants import * +from youtubesearchpython.core.requests import RequestCore + +K = TypeVar("K") +T = TypeVar("T") + + +class CommentsCore(RequestCore): + commentsComponent = {"result": []} + result = None + continuationKey = None + isNextRequest = False + response = None + + def __init__(self, videoLink: str): + super().__init__() + self.responseSource = None + self.videoLink = videoLink + + def prepare_continuation_request(self): + self.data = { + "context": {"client": {"clientName": "WEB", "clientVersion": "2.20210820.01.00"}}, + "videoId": getVideoId(self.videoLink) + } + self.url = f"https://www.youtube.com/youtubei/v1/next?key={searchKey}" + + def prepare_comments_request(self): + self.data = { + "context": {"client": {"clientName": "WEB", "clientVersion": "2.20210820.01.00"}}, + "continuation": self.continuationKey + } + + def parse_source(self): + self.responseSource = getValue(self.response.json(), [ + "onResponseReceivedEndpoints", + 0 if self.isNextRequest else 1, + "appendContinuationItemsAction" if self.isNextRequest else "reloadContinuationItemsCommand", + "continuationItems", + ]) + + def parse_continuation_source(self): + self.continuationKey = getValue( + self.response.json(), + [ + "contents", + "twoColumnWatchNextResults", + "results", + "results", + "contents", + -1, + "itemSectionRenderer", + "contents", + 0, + "continuationItemRenderer", + "continuationEndpoint", + "continuationCommand", + "token", + ] + ) + + def sync_make_comment_request(self): + self.prepare_comments_request() + self.response = self.syncPostRequest() + if self.response.status_code == 200: + self.parse_source() + + def sync_make_continuation_request(self): + self.prepare_continuation_request() + self.response = self.syncPostRequest() + if self.response.status_code == 200: + self.parse_continuation_source() + if not self.continuationKey: + raise Exception("Could not retrieve continuation token") + else: + raise Exception("Status code is not 200") + + async def async_make_comment_request(self): + self.prepare_comments_request() + self.response = await self.asyncPostRequest() + if self.response.status_code == 200: + self.parse_source() + + async def async_make_continuation_request(self): + self.prepare_continuation_request() + self.response = await self.asyncPostRequest() + if self.response.status_code == 200: + self.parse_continuation_source() + if not self.continuationKey: + raise Exception("Could not retrieve continuation token") + else: + raise Exception("Status code is not 200") + + def sync_create(self): + self.sync_make_continuation_request() + self.sync_make_comment_request() + self.__getComponents() + + def sync_create_next(self): + self.isNextRequest = True + self.sync_make_comment_request() + self.__getComponents() + + async def async_create(self): + await self.async_make_continuation_request() + await self.async_make_comment_request() + self.__getComponents() + + async def async_create_next(self): + self.isNextRequest = True + await self.async_make_comment_request() + self.__getComponents() + + def __getComponents(self) -> None: + comments = [] + for comment in self.responseSource: + comment = getValue(comment, ["commentThreadRenderer", "comment", "commentRenderer"]) + #print(json.dumps(comment, indent=4)) + try: + j = { + "id": self.__getValue(comment, ["commentId"]), + "author": { + "id": self.__getValue(comment, ["authorEndpoint", "browseEndpoint", "browseId"]), + "name": self.__getValue(comment, ["authorText", "simpleText"]), + "thumbnails": self.__getValue(comment, ["authorThumbnail", "thumbnails"]) + }, + "content": self.__getValue(comment, ["contentText", "runs", 0, "text"]), + "published": self.__getValue(comment, ["publishedTimeText", "runs", 0, "text"]), + "isLiked": self.__getValue(comment, ["isLiked"]), + "authorIsChannelOwner": self.__getValue(comment, ["authorIsChannelOwner"]), + "voteStatus": self.__getValue(comment, ["voteStatus"]), + "votes": { + "simpleText": self.__getValue(comment, ["voteCount", "simpleText"]), + "label": self.__getValue(comment, ["voteCount", "accessibility", "accessibilityData", "label"]) + }, + "replyCount": self.__getValue(comment, ["replyCount"]), + } + comments.append(j) + except: + pass + + self.commentsComponent["result"].extend(comments) + self.continuationKey = self.__getValue(self.responseSource, [-1, "continuationItemRenderer", "continuationEndpoint", "continuationCommand", "token"]) + + def __result(self, mode: int) -> Union[dict, str]: + if mode == ResultMode.dict: + return self.commentsComponent + elif mode == ResultMode.json: + return json.dumps(self.commentsComponent, indent=4) + + def __getValue(self, source: dict, path: Iterable[str]) -> Union[str, int, dict, None]: + value = source + for key in path: + if type(key) is str: + if key in value.keys(): + value = value[key] + else: + value = None + break + elif type(key) is int: + if len(value) != 0: + value = value[key] + else: + value = None + break + return value + + def __getAllWithKey(self, source: Iterable[Mapping[K, T]], key: K) -> Iterable[T]: + for item in source: + if key in item: + yield item[key] + + def __getValueEx(self, source: dict, path: List[str]) -> Iterable[Union[str, int, dict, None]]: + if len(path) <= 0: + yield source + return + key = path[0] + upcoming = path[1:] + if key is None: + following_key = upcoming[0] + upcoming = upcoming[1:] + if following_key is None: + raise Exception("Cannot search for a key twice consecutive or at the end with no key given") + values = self.__getAllWithKey(source, following_key) + for val in values: + yield from self.__getValueEx(val, path=upcoming) + else: + val = self.__getValue(source, path=[key]) + yield from self.__getValueEx(val, path=upcoming) + + def __getFirstValue(self, source: dict, path: Iterable[str]) -> Union[str, int, dict, None]: + values = self.__getValueEx(source, list(path)) + for val in values: + if val is not None: + return val + return None diff --git a/youtubesearchpython/extras.py b/youtubesearchpython/extras.py index 09400b7..871aa86 100644 --- a/youtubesearchpython/extras.py +++ b/youtubesearchpython/extras.py @@ -2,6 +2,7 @@ from typing import Union from youtubesearchpython.core import VideoCore +from youtubesearchpython.core.comments import CommentsCore from youtubesearchpython.core.hashtag import HashtagCore from youtubesearchpython.core.playlist import PlaylistCore from youtubesearchpython.core.suggestions import SuggestionsCore @@ -10,7 +11,8 @@ class Video: @staticmethod - def get(videoLink: str, mode: int = ResultMode.dict, timeout: int = None, get_upload_date: bool = False) -> Union[dict, str, None]: + def get(videoLink: str, mode: int = ResultMode.dict, timeout: int = None, get_upload_date: bool = False) -> Union[ + dict, str, None]: '''Fetches information and formats for the given video link or ID. Returns None if video is unavailable. @@ -261,7 +263,7 @@ def get(videoLink: str, mode: int = ResultMode.dict, timeout: int = None, get_up vc.sync_html_create() vc.sync_create() return vc.result - + @staticmethod def getInfo(videoLink: str, mode: int = ResultMode.dict, timeout: int = None) -> Union[dict, str, None]: '''Fetches only information for the given video link or ID. @@ -536,7 +538,6 @@ def getFormats(videoLink: str, mode: int = ResultMode.dict, timeout: int = None) return vc.result - class Playlist: '''Fetches information and videos for the given playlist link. Returns None if playlist is unavailable. @@ -570,6 +571,7 @@ def __init__(self, playlistLink: str, timeout: int = None): '''Fetches more susequent videos of the playlist, and appends to the `videos` list. `hasMoreVideos` bool indicates whether more videos can be fetched or not. ''' + def getNextVideos(self) -> None: self.__playlist._next() self.videos = self.__playlist.result['videos'] @@ -1128,7 +1130,7 @@ def get(playlistLink: str, mode: int = ResultMode.dict, timeout: int = None) -> pc = PlaylistCore(playlistLink, None, mode, timeout) pc.sync_create() return pc.result - + @staticmethod def getInfo(playlistLink: str, mode: int = ResultMode.dict, timeout: int = None) -> Union[dict, str, None]: '''Fetches only information for the given playlist link. @@ -1704,7 +1706,6 @@ def getVideos(playlistLink: str, mode: int = ResultMode.dict, timeout: int = Non return ps.result - class Hashtag(HashtagCore): '''Fetches videos for the given hashtag. @@ -1781,13 +1782,38 @@ class Hashtag(HashtagCore): ] } ''' + def __init__(self, hashtag: str, limit: int = 60, language: str = 'en', region: str = 'US', timeout: int = None): super().__init__(hashtag, limit, language, region, timeout) self.sync_create() + class Suggestions(SuggestionsCore): def __init__(self, language: str = "en", region: str = "US", timeout: int = None): super().__init__(language, region, timeout) def get(self, query: str, mode: int = ResultMode.dict): return self._get(query, mode) + + +class Comments: + comments = [] + hasMoreComments = False + + def __init__(self, playlistLink: str, timeout: int = None): + self.timeout = timeout + self.__comments = CommentsCore(playlistLink) + self.__comments.sync_create() + self.comments = self.__comments.commentsComponent + self.hasMoreComments = self.__comments.continuationKey is not None + + def getNextComments(self) -> None: + self.__comments.sync_create_next() + self.comments = self.__comments.commentsComponent + self.hasMoreComments = self.__comments.continuationKey is not None + + @staticmethod + def get(playlistLink: str) -> Union[dict, str, None]: + pc = CommentsCore(playlistLink) + pc.sync_create() + return pc.commentsComponent From a9bcc93bfd8f660da5cffc99bc39456c420c7bd1 Mon Sep 17 00:00:00 2001 From: mytja Date: Thu, 20 Jan 2022 16:28:44 +0100 Subject: [PATCH 2/2] [Comments] Updates to the README --- README.md | 724 +++++++++++++++++++- setup.py | 2 +- youtubesearchpython/__future__/README.md | 733 ++++++++++++++++++++- youtubesearchpython/__future__/__init__.py | 2 +- youtubesearchpython/__init__.py | 2 +- 5 files changed, 1435 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 95b68a8..0c3ba20 100644 --- a/README.md +++ b/README.md @@ -1404,21 +1404,725 @@ print('Found all the comments.') Example Result ```bash -Videos Retrieved: 20 -Getting more videos... -Videos Retrieved: 40 -Getting more videos... -Videos Retrieved: 60 -Getting more videos... -Videos Retrieved: 80 -Getting more videos... -Videos Retrieved: 100 -Getting more videos... +20 +Getting more comments... +40 +Getting more comments... +60 +Getting more comments... +80 +Getting more comments... +100 +Getting more comments... ... ```
+#### Get first 20 comments of a video +You can use a Comments.get method for that. +```python +from youtubesearchpython import * + +# You can either pass an ID or a URL +video_id = "_ZdsmLgCVdU" +comments = Comments.get(video_id) + +print(comments) +``` + +
+ Example Result + +```bash +{ + "result":[ + { + "id":"Ugh2UTT69BnjaHgCoAEC", + "author":{ + "id":"UCBykgwvHh2SX5HH7dVWLkqQ", + "name":"Daikaiju Danielle", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSC8WrgmUHF5l6DYEb8jabim9nE0Ko1vQ_KFOly0w=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSC8WrgmUHF5l6DYEb8jabim9nE0Ko1vQ_KFOly0w=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSC8WrgmUHF5l6DYEb8jabim9nE0Ko1vQ_KFOly0w=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"The boy probably represents youth and the pure, free spirit of being young. When you grow up, it's hard to find that spirit again. You have to search for it.", + "published":"5 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"5.9K", + "label":"5.9K likes" + }, + "replyCount":81 + }, + { + "id":"UgzyjWeS_wVmoVrcyVZ4AaABAg", + "author":{ + "id":"UCMMJk2iiIanIFtTwnLK8XBA", + "name":"naomi", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/wzrS0agEf0NBFXvcpQJFF-6BwdciRFqzVf_dmgv4Unk7e9AFA7Sb7K7hsLeXdZsOX26J0J4Y=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/wzrS0agEf0NBFXvcpQJFF-6BwdciRFqzVf_dmgv4Unk7e9AFA7Sb7K7hsLeXdZsOX26J0J4Y=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/wzrS0agEf0NBFXvcpQJFF-6BwdciRFqzVf_dmgv4Unk7e9AFA7Sb7K7hsLeXdZsOX26J0J4Y=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"Strange that I showed this to my brother three days before his death not knowing I would soon relate to it.", + "published":"1 year ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"5.2K", + "label":"5.2K likes" + }, + "replyCount":147 + }, + { + "id":"UgyP3NpP-qA9T80YRVh4AaABAg", + "author":{ + "id":"UCCekImfpPQw94ZHeQy98S_A", + "name":"Noura", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSA9_Di2v12v_MycDkKjvhD8D3dRSt9pyZIcCekeg=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSA9_Di2v12v_MycDkKjvhD8D3dRSt9pyZIcCekeg=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSA9_Di2v12v_MycDkKjvhD8D3dRSt9pyZIcCekeg=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"In Arabic when we want to express how much we love and cherish someone we say \"you are my eyes\".. And for some reason that line \"don\\'t you know you got my eyes\" makes me really nostalgic and sad.", + "published":"1 year ago (edited)", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"3.8K", + "label":"3.8K likes" + }, + "replyCount":65 + }, + { + "id":"Ugy-JqQw3w3MXwxGZHZ4AaABAg", + "author":{ + "id":"UC6irqN4Fk_z-CdK47pkLTgQ", + "name":"Leo Trombetta", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTogXyBXEX1LAzehhiYyx9amCWGkcMRCaa3e-pEgg=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTogXyBXEX1LAzehhiYyx9amCWGkcMRCaa3e-pEgg=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTogXyBXEX1LAzehhiYyx9amCWGkcMRCaa3e-pEgg=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"As a mother whose had to let her son go for his life to be better, this song is about exactly that. The pain and sacrifice and love and the warm memories you pray they will have of the sweetest moments you've shared when you held them so long ago.. I miss you.", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"2K", + "label":"2K likes" + }, + "replyCount":23 + }, + { + "id":"Ugwv8lwT4LS906Y9P1p4AaABAg", + "author":{ + "id":"UClMs_LKpgCPC9acJQpGRcbQ", + "name":"Arundhati", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTHadgrB-BvJ2zqtN9_f2ttscQEH0Sc3awtvg73ug=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTHadgrB-BvJ2zqtN9_f2ttscQEH0Sc3awtvg73ug=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTHadgrB-BvJ2zqtN9_f2ttscQEH0Sc3awtvg73ug=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"It’s been 3 years and I still can’t sing that chorus without tearing up", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"1K", + "label":"1K likes" + }, + "replyCount":16 + }, + { + "id":"Ugx5NiWjHQI1aGWI8ex4AaABAg", + "author":{ + "id":"UCeuMECoMfhC9Fyn5veduj1w", + "name":"dona nova", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLQC9P35p4nKLBaoDkWwsGjQCVrrBs_lPVCNsTQ5oPg=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLQC9P35p4nKLBaoDkWwsGjQCVrrBs_lPVCNsTQ5oPg=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLQC9P35p4nKLBaoDkWwsGjQCVrrBs_lPVCNsTQ5oPg=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"My dad passed away in 2012 and now he communicates to me sometimes through songs. If I ask him a question the next song I hear will have the answer. This year I had to start my life over completely and I have moved across the country away from a toxic person, and then I moved again from the next place I lived from another toxic person, all during the pandemic. I am also legally blind and otherwise disabled so I worried about how I would make it on my own after my losses and divorce. I don't know anybody here and I'm completely alone. This comes after 10 years of loss and change that started with his death. Anyway, When I asked him how could I ever have a life again he sent me this song. He always does. I have been told he is my spirit guide and I can tell when he's here. I love glass animals", + "published":"1 year ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"1.6K", + "label":"1.6K likes" + }, + "replyCount":72 + }, + { + "id":"UgyHLTfBhMAh39IcPAp4AaABAg", + "author":{ + "id":"UCK8evpEndlyLgjcXTYfOVtQ", + "name":"UnforgettableAlice", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSlrVENCyh_Wk6p8UrZAPEIS3pmUnGOiTb2zwIx1g=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSlrVENCyh_Wk6p8UrZAPEIS3pmUnGOiTb2zwIx1g=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSlrVENCyh_Wk6p8UrZAPEIS3pmUnGOiTb2zwIx1g=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"Vocalist/guitarist Dave Bayley explained the story behind this song to Paste magazine: \"The idea for this one came from a story someone told me once. They were telling me about their child, and something awful had happened to them. She was crying - but at the same time the memories that they had from that previous life made her so happy - so she was also smiling. That combination of emotions kind of made me feel like my heart was being ripped apart but also optimistic in a weird way. She had found a way to see happiness in this awful thing that had happened to her. That combination of emotions is what this song is getting at.\"", + "published":"3 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"5.6K", + "label":"5.6K likes" + }, + "replyCount":31 + }, + { + "id":"Ugwq4Hc5dcjphfdabi14AaABAg", + "author":{ + "id":"UChtQ0Lhb3UvlSjPJ_1gcRdQ", + "name":"Later", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTmkn0CgPeiW8hmoP3VEokLg-AN2Y7xkTz7HeOa1w=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTmkn0CgPeiW8hmoP3VEokLg-AN2Y7xkTz7HeOa1w=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTmkn0CgPeiW8hmoP3VEokLg-AN2Y7xkTz7HeOa1w=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"\"Don\\'t you know you got my eyes\"", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"3.3K", + "label":"3.3K likes" + }, + "replyCount":19 + }, + { + "id":"UgxC1mFXH9ddTB6qa5h4AaABAg", + "author":{ + "id":"UC8iw4k1Ojbd5QsK35IeT5mg", + "name":"Anna Dunne", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSzwmG3DSiHB8XuKUqe6CjdlbSPuln1e1kOKS7i6w=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSzwmG3DSiHB8XuKUqe6CjdlbSPuln1e1kOKS7i6w=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSzwmG3DSiHB8XuKUqe6CjdlbSPuln1e1kOKS7i6w=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"I lost my little sons to the care system because i had depression and experienced domestic abuse. I see them now sometimes. It doesn't get any easier and I miss them a lot. <3 This song means a lot. ", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"1.9K", + "label":"1.9K likes" + }, + "replyCount":25 + }, + { + "id":"Ugw4ux8km05TQ3kGHmV4AaABAg", + "author":{ + "id":"UCfqMzgWyCUuUWBBaD4WgynA", + "name":"Jemma Scott", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLT44n2_05S_bMU2ME_Z1WSk6xTIJ3cs82vSF920pg=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLT44n2_05S_bMU2ME_Z1WSk6xTIJ3cs82vSF920pg=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLT44n2_05S_bMU2ME_Z1WSk6xTIJ3cs82vSF920pg=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"Warning ⚠️: ", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"2.1K", + "label":"2.1K likes" + }, + "replyCount":5 + }, + { + "id":"Ugy5hJrVHhrZ25VZoDd4AaABAg", + "author":{ + "id":"UCCooCkWoIN-QmHrVo0t5d9Q", + "name":"Samy Lind", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSHCXYVj0EyiLYxeBvhP6E4gnS1gRzDSYleBQ=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSHCXYVj0EyiLYxeBvhP6E4gnS1gRzDSYleBQ=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSHCXYVj0EyiLYxeBvhP6E4gnS1gRzDSYleBQ=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"I know no one cares about stuff like this but I just wanted to speak on the power of art because it’s beautiful. This video and this entire album has been a huge catalyst and help in me saving myself and my family. I was forcing my husband and 3 kids to live with my abusive parents so that I could try to make them love us before they died. All they did was hurt us more and instead of dealing with it I kept staying there and started doing pain pills. This video helped hit home how much I don’t need my parents and it made me never want to escape from my reality again. I hadn’t quite gotten to a stage of disgust, but I sure have done a lot of regrettable things. This album helps me have the strength to keep doing my best to learn to be better and to learn to be the best I can be for my kids. I don’t want to be held back by anything anymore and I don’t want to hold back my family. Thank you glass animal and crew:) your saving lives with this music", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"493", + "label":"493 likes" + }, + "replyCount":7 + }, + { + "id":"UgyfG6DRZQZe5NtvY9t4AaABAg", + "author":{ + "id":"UCFlsa-V7ZjC3SJG1MgHeTxA", + "name":"Adi ☆", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/2r2ZQYcZaViZp8n37bmAnJx-irYy7mOUkpkC7nprEaoeSY2jEJ9wQ-kQnpxN6Z4WMWFMT9JzUw=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/2r2ZQYcZaViZp8n37bmAnJx-irYy7mOUkpkC7nprEaoeSY2jEJ9wQ-kQnpxN6Z4WMWFMT9JzUw=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/2r2ZQYcZaViZp8n37bmAnJx-irYy7mOUkpkC7nprEaoeSY2jEJ9wQ-kQnpxN6Z4WMWFMT9JzUw=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"Lyrics:[Verse 1]", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"955", + "label":"955 likes" + }, + "replyCount":9 + }, + { + "id":"Ugi30kIt00U573gCoAEC", + "author":{ + "id":"UCZbJ_Q3ClurxYlthgTecgow", + "name":"love, doggo", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/IJF61exnEIJZDlnphGN9yXnV_fQSJhdAyPqgF_e3pJ42iwvTQprgQaty-uVyvjiMJpnaekxeBg=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/IJF61exnEIJZDlnphGN9yXnV_fQSJhdAyPqgF_e3pJ42iwvTQprgQaty-uVyvjiMJpnaekxeBg=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/IJF61exnEIJZDlnphGN9yXnV_fQSJhdAyPqgF_e3pJ42iwvTQprgQaty-uVyvjiMJpnaekxeBg=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"This is a rare thing... I like every song a band makes", + "published":"5 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"3.9K", + "label":"3.9K likes" + }, + "replyCount":67 + }, + { + "id":"UgzDNmCLzmkNIGV_iB14AaABAg", + "author":{ + "id":"UCrdOXfYndK2UEjAKRg-hUcw", + "name":"Cherry", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/oRPZKN6SL1SoMc5J7FQIHiA1C1wQZe1YfRHbkxaLnNp9Vi7Vl2PCY11oTK5mDms-NHXSGqFsKQ=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/oRPZKN6SL1SoMc5J7FQIHiA1C1wQZe1YfRHbkxaLnNp9Vi7Vl2PCY11oTK5mDms-NHXSGqFsKQ=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/oRPZKN6SL1SoMc5J7FQIHiA1C1wQZe1YfRHbkxaLnNp9Vi7Vl2PCY11oTK5mDms-NHXSGqFsKQ=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"I hope the mother who inspired this can hear it and feel her child close to her again.", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"410", + "label":"410 likes" + }, + "replyCount":1 + }, + { + "id":"UgyQEih224ElUkT2AXl4AaABAg", + "author":{ + "id":"UC7M3_B55yIvo4DZS3BvgA1g", + "name":"Sirce Guevara", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLRJhxg_aeXmbGuH8wbuCcGWVtRs6tFKPqkxw4-lcJ8=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLRJhxg_aeXmbGuH8wbuCcGWVtRs6tFKPqkxw4-lcJ8=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLRJhxg_aeXmbGuH8wbuCcGWVtRs6tFKPqkxw4-lcJ8=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"I cried watching this video, this is my first time seeing it.. It just reminded me of my mother, how she raised me alone. Seeing me happy and dancing all her life . How she works hard day by day just so I have a roof on my head and food on the table. She's amazing...", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"271", + "label":"271 likes" + }, + "replyCount":1 + }, + { + "id":"UgxSKtnwJ1fL1cGECFN4AaABAg", + "author":{ + "id":"UCaWu5P4tl4leNsq0d6K5JfA", + "name":"Brylee D", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSnWU59WluXZehM5VxmcbX6Unk_rgJc699gUp7lxw=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSnWU59WluXZehM5VxmcbX6Unk_rgJc699gUp7lxw=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSnWU59WluXZehM5VxmcbX6Unk_rgJc699gUp7lxw=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"I have a crush on that background wind instrument", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"4.5K", + "label":"4.5K likes" + }, + "replyCount":36 + }, + { + "id":"Ugx885faaugZ-KS2ht14AaABAg", + "author":{ + "id":"UCAv-kFdFs9zZX4IR9y77sTg", + "name":"berry tart subs ✿", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/RIEhlWERKQrY6oscMFEVW9pyDVKwndKkfFfnMTGxJIFHV2np4asu1syE-C016cZlcgZYtkdvrCA=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/RIEhlWERKQrY6oscMFEVW9pyDVKwndKkfFfnMTGxJIFHV2np4asu1syE-C016cZlcgZYtkdvrCA=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/RIEhlWERKQrY6oscMFEVW9pyDVKwndKkfFfnMTGxJIFHV2np4asu1syE-C016cZlcgZYtkdvrCA=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"This song literally makes me cry every time I hear it it's just so sweet", + "published":"1 year ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"73", + "label":"73 likes" + }, + "replyCount":1 + }, + { + "id":"UgxfMf3PW8muQIKHeX54AaABAg", + "author":{ + "id":"UCs5_3PBRo9VoCCbDWDMpa-g", + "name":"Victor Rodriguez", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLRe_mumWc8G4a9DvzNQ7FBA_hctTvwTJskAdw=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLRe_mumWc8G4a9DvzNQ7FBA_hctTvwTJskAdw=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLRe_mumWc8G4a9DvzNQ7FBA_hctTvwTJskAdw=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"I hope my son can find some type of solace or message in this song one day. We lost his mother my wife when she passed suddenly three months ago at 23 years young. He was only 2 years old and 7 months when it happened. It was a short time for him but so many happy memories. They spent every single hour of every single day together. We’re so lost and devasted without you, We love you Deja C Rodriguez", + "published":"8 months ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"126", + "label":"126 likes" + }, + "replyCount":2 + }, + { + "id":"UgiuS-ehhcqhHXgCoAEC", + "author":{ + "id":"UCd6gX2dxkokyH70cbUocq7Q", + "name":"bunnyluveable", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSt6NFUcOAfGB1C0BL0f18q8sPUX0UQBhYV_A=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSt6NFUcOAfGB1C0BL0f18q8sPUX0UQBhYV_A=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSt6NFUcOAfGB1C0BL0f18q8sPUX0UQBhYV_A=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"their music is like being wrapped in a warm blanket on a chilly day.", + "published":"5 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"563", + "label":"563 likes" + }, + "replyCount":6 + }, + { + "id":"UgwEdhuY0RUuiyBqpVN4AaABAg", + "author":{ + "id":"UC8GIfeF1UytnIdBUx7eODBg", + "name":"TheBnjmnMiles", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLQjQG6jvrGnj9ejtjfO-pbXWwekST4e_qxK=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLQjQG6jvrGnj9ejtjfO-pbXWwekST4e_qxK=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLQjQG6jvrGnj9ejtjfO-pbXWwekST4e_qxK=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"Why is nobody talking about this kid’s freakin’ sweet dance moves?", + "published":"7 months ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"210", + "label":"210 likes" + }, + "replyCount":4 + } + ] +} +``` + +
+ ## License diff --git a/setup.py b/setup.py index 9bc5b28..3a8ce1c 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name="youtube-search-python", - version="1.5.3", + version="1.6.0", author="Hitesh Kumar Saini", license='MIT', author_email="saini123hitesh@gmail.com", diff --git a/youtubesearchpython/__future__/README.md b/youtubesearchpython/__future__/README.md index 40753db..05c4307 100644 --- a/youtubesearchpython/__future__/README.md +++ b/youtubesearchpython/__future__/README.md @@ -1108,14 +1108,10 @@ from youtubesearchpython.__future__ import * video_id = "_ZdsmLgCVdU" comments = Comments(video_id) -# Important to query before retrieving comments -await comments.getNextComments() -print(f'Comments Retrieved: {len(comments.comments["result"])}') - while comments.hasMoreComments: print('Getting more comments...') await comments.getNextComments() - print(f'Comments Retrieved: {len(comments.comments["result"])}') + print(len(comments.comments["result"])) print('Found all the comments.') ``` @@ -1124,19 +1120,726 @@ print('Found all the comments.') Example Result ```bash -Videos Retrieved: 20 -Getting more videos... -Videos Retrieved: 40 -Getting more videos... -Videos Retrieved: 60 -Getting more videos... -Videos Retrieved: 80 -Getting more videos... -Videos Retrieved: 100 -Getting more videos... +Getting more comments... +20 +Getting more comments... +40 +Getting more comments... +60 +Getting more comments... +80 +Getting more comments... +100 +Getting more comments... ... ``` + + +#### Get first 20 comments of a video +You can use a Comments.get method for that. +```python +from youtubesearchpython.__future__ import * + +# You can either pass an ID or a URL +video_id = "_ZdsmLgCVdU" +comments = await Comments.get(video_id) + +print(comments) +``` + +
+ Example Result + +```bash +{ + "result":[ + { + "id":"Ugh2UTT69BnjaHgCoAEC", + "author":{ + "id":"UCBykgwvHh2SX5HH7dVWLkqQ", + "name":"Daikaiju Danielle", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSC8WrgmUHF5l6DYEb8jabim9nE0Ko1vQ_KFOly0w=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSC8WrgmUHF5l6DYEb8jabim9nE0Ko1vQ_KFOly0w=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSC8WrgmUHF5l6DYEb8jabim9nE0Ko1vQ_KFOly0w=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"The boy probably represents youth and the pure, free spirit of being young. When you grow up, it's hard to find that spirit again. You have to search for it.", + "published":"5 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"5.9K", + "label":"5.9K likes" + }, + "replyCount":81 + }, + { + "id":"UgzyjWeS_wVmoVrcyVZ4AaABAg", + "author":{ + "id":"UCMMJk2iiIanIFtTwnLK8XBA", + "name":"naomi", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/wzrS0agEf0NBFXvcpQJFF-6BwdciRFqzVf_dmgv4Unk7e9AFA7Sb7K7hsLeXdZsOX26J0J4Y=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/wzrS0agEf0NBFXvcpQJFF-6BwdciRFqzVf_dmgv4Unk7e9AFA7Sb7K7hsLeXdZsOX26J0J4Y=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/wzrS0agEf0NBFXvcpQJFF-6BwdciRFqzVf_dmgv4Unk7e9AFA7Sb7K7hsLeXdZsOX26J0J4Y=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"Strange that I showed this to my brother three days before his death not knowing I would soon relate to it.", + "published":"1 year ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"5.2K", + "label":"5.2K likes" + }, + "replyCount":147 + }, + { + "id":"UgyP3NpP-qA9T80YRVh4AaABAg", + "author":{ + "id":"UCCekImfpPQw94ZHeQy98S_A", + "name":"Noura", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSA9_Di2v12v_MycDkKjvhD8D3dRSt9pyZIcCekeg=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSA9_Di2v12v_MycDkKjvhD8D3dRSt9pyZIcCekeg=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSA9_Di2v12v_MycDkKjvhD8D3dRSt9pyZIcCekeg=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"In Arabic when we want to express how much we love and cherish someone we say \"you are my eyes\".. And for some reason that line \"don\\'t you know you got my eyes\" makes me really nostalgic and sad.", + "published":"1 year ago (edited)", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"3.8K", + "label":"3.8K likes" + }, + "replyCount":65 + }, + { + "id":"Ugy-JqQw3w3MXwxGZHZ4AaABAg", + "author":{ + "id":"UC6irqN4Fk_z-CdK47pkLTgQ", + "name":"Leo Trombetta", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTogXyBXEX1LAzehhiYyx9amCWGkcMRCaa3e-pEgg=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTogXyBXEX1LAzehhiYyx9amCWGkcMRCaa3e-pEgg=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTogXyBXEX1LAzehhiYyx9amCWGkcMRCaa3e-pEgg=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"As a mother whose had to let her son go for his life to be better, this song is about exactly that. The pain and sacrifice and love and the warm memories you pray they will have of the sweetest moments you've shared when you held them so long ago.. I miss you.", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"2K", + "label":"2K likes" + }, + "replyCount":23 + }, + { + "id":"Ugwv8lwT4LS906Y9P1p4AaABAg", + "author":{ + "id":"UClMs_LKpgCPC9acJQpGRcbQ", + "name":"Arundhati", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTHadgrB-BvJ2zqtN9_f2ttscQEH0Sc3awtvg73ug=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTHadgrB-BvJ2zqtN9_f2ttscQEH0Sc3awtvg73ug=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTHadgrB-BvJ2zqtN9_f2ttscQEH0Sc3awtvg73ug=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"It’s been 3 years and I still can’t sing that chorus without tearing up", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"1K", + "label":"1K likes" + }, + "replyCount":16 + }, + { + "id":"Ugx5NiWjHQI1aGWI8ex4AaABAg", + "author":{ + "id":"UCeuMECoMfhC9Fyn5veduj1w", + "name":"dona nova", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLQC9P35p4nKLBaoDkWwsGjQCVrrBs_lPVCNsTQ5oPg=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLQC9P35p4nKLBaoDkWwsGjQCVrrBs_lPVCNsTQ5oPg=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLQC9P35p4nKLBaoDkWwsGjQCVrrBs_lPVCNsTQ5oPg=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"My dad passed away in 2012 and now he communicates to me sometimes through songs. If I ask him a question the next song I hear will have the answer. This year I had to start my life over completely and I have moved across the country away from a toxic person, and then I moved again from the next place I lived from another toxic person, all during the pandemic. I am also legally blind and otherwise disabled so I worried about how I would make it on my own after my losses and divorce. I don't know anybody here and I'm completely alone. This comes after 10 years of loss and change that started with his death. Anyway, When I asked him how could I ever have a life again he sent me this song. He always does. I have been told he is my spirit guide and I can tell when he's here. I love glass animals", + "published":"1 year ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"1.6K", + "label":"1.6K likes" + }, + "replyCount":72 + }, + { + "id":"UgyHLTfBhMAh39IcPAp4AaABAg", + "author":{ + "id":"UCK8evpEndlyLgjcXTYfOVtQ", + "name":"UnforgettableAlice", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSlrVENCyh_Wk6p8UrZAPEIS3pmUnGOiTb2zwIx1g=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSlrVENCyh_Wk6p8UrZAPEIS3pmUnGOiTb2zwIx1g=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSlrVENCyh_Wk6p8UrZAPEIS3pmUnGOiTb2zwIx1g=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"Vocalist/guitarist Dave Bayley explained the story behind this song to Paste magazine: \"The idea for this one came from a story someone told me once. They were telling me about their child, and something awful had happened to them. She was crying - but at the same time the memories that they had from that previous life made her so happy - so she was also smiling. That combination of emotions kind of made me feel like my heart was being ripped apart but also optimistic in a weird way. She had found a way to see happiness in this awful thing that had happened to her. That combination of emotions is what this song is getting at.\"", + "published":"3 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"5.6K", + "label":"5.6K likes" + }, + "replyCount":31 + }, + { + "id":"Ugwq4Hc5dcjphfdabi14AaABAg", + "author":{ + "id":"UChtQ0Lhb3UvlSjPJ_1gcRdQ", + "name":"Later", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTmkn0CgPeiW8hmoP3VEokLg-AN2Y7xkTz7HeOa1w=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTmkn0CgPeiW8hmoP3VEokLg-AN2Y7xkTz7HeOa1w=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLTmkn0CgPeiW8hmoP3VEokLg-AN2Y7xkTz7HeOa1w=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"\"Don\\'t you know you got my eyes\"", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"3.3K", + "label":"3.3K likes" + }, + "replyCount":19 + }, + { + "id":"UgxC1mFXH9ddTB6qa5h4AaABAg", + "author":{ + "id":"UC8iw4k1Ojbd5QsK35IeT5mg", + "name":"Anna Dunne", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSzwmG3DSiHB8XuKUqe6CjdlbSPuln1e1kOKS7i6w=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSzwmG3DSiHB8XuKUqe6CjdlbSPuln1e1kOKS7i6w=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSzwmG3DSiHB8XuKUqe6CjdlbSPuln1e1kOKS7i6w=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"I lost my little sons to the care system because i had depression and experienced domestic abuse. I see them now sometimes. It doesn't get any easier and I miss them a lot. <3 This song means a lot. ", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"1.9K", + "label":"1.9K likes" + }, + "replyCount":25 + }, + { + "id":"Ugw4ux8km05TQ3kGHmV4AaABAg", + "author":{ + "id":"UCfqMzgWyCUuUWBBaD4WgynA", + "name":"Jemma Scott", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLT44n2_05S_bMU2ME_Z1WSk6xTIJ3cs82vSF920pg=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLT44n2_05S_bMU2ME_Z1WSk6xTIJ3cs82vSF920pg=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLT44n2_05S_bMU2ME_Z1WSk6xTIJ3cs82vSF920pg=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"Warning ⚠️: ", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"2.1K", + "label":"2.1K likes" + }, + "replyCount":5 + }, + { + "id":"Ugy5hJrVHhrZ25VZoDd4AaABAg", + "author":{ + "id":"UCCooCkWoIN-QmHrVo0t5d9Q", + "name":"Samy Lind", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSHCXYVj0EyiLYxeBvhP6E4gnS1gRzDSYleBQ=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSHCXYVj0EyiLYxeBvhP6E4gnS1gRzDSYleBQ=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSHCXYVj0EyiLYxeBvhP6E4gnS1gRzDSYleBQ=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"I know no one cares about stuff like this but I just wanted to speak on the power of art because it’s beautiful. This video and this entire album has been a huge catalyst and help in me saving myself and my family. I was forcing my husband and 3 kids to live with my abusive parents so that I could try to make them love us before they died. All they did was hurt us more and instead of dealing with it I kept staying there and started doing pain pills. This video helped hit home how much I don’t need my parents and it made me never want to escape from my reality again. I hadn’t quite gotten to a stage of disgust, but I sure have done a lot of regrettable things. This album helps me have the strength to keep doing my best to learn to be better and to learn to be the best I can be for my kids. I don’t want to be held back by anything anymore and I don’t want to hold back my family. Thank you glass animal and crew:) your saving lives with this music", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"493", + "label":"493 likes" + }, + "replyCount":7 + }, + { + "id":"UgyfG6DRZQZe5NtvY9t4AaABAg", + "author":{ + "id":"UCFlsa-V7ZjC3SJG1MgHeTxA", + "name":"Adi ☆", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/2r2ZQYcZaViZp8n37bmAnJx-irYy7mOUkpkC7nprEaoeSY2jEJ9wQ-kQnpxN6Z4WMWFMT9JzUw=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/2r2ZQYcZaViZp8n37bmAnJx-irYy7mOUkpkC7nprEaoeSY2jEJ9wQ-kQnpxN6Z4WMWFMT9JzUw=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/2r2ZQYcZaViZp8n37bmAnJx-irYy7mOUkpkC7nprEaoeSY2jEJ9wQ-kQnpxN6Z4WMWFMT9JzUw=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"Lyrics:[Verse 1]", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"955", + "label":"955 likes" + }, + "replyCount":9 + }, + { + "id":"Ugi30kIt00U573gCoAEC", + "author":{ + "id":"UCZbJ_Q3ClurxYlthgTecgow", + "name":"love, doggo", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/IJF61exnEIJZDlnphGN9yXnV_fQSJhdAyPqgF_e3pJ42iwvTQprgQaty-uVyvjiMJpnaekxeBg=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/IJF61exnEIJZDlnphGN9yXnV_fQSJhdAyPqgF_e3pJ42iwvTQprgQaty-uVyvjiMJpnaekxeBg=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/IJF61exnEIJZDlnphGN9yXnV_fQSJhdAyPqgF_e3pJ42iwvTQprgQaty-uVyvjiMJpnaekxeBg=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"This is a rare thing... I like every song a band makes", + "published":"5 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"3.9K", + "label":"3.9K likes" + }, + "replyCount":67 + }, + { + "id":"UgzDNmCLzmkNIGV_iB14AaABAg", + "author":{ + "id":"UCrdOXfYndK2UEjAKRg-hUcw", + "name":"Cherry", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/oRPZKN6SL1SoMc5J7FQIHiA1C1wQZe1YfRHbkxaLnNp9Vi7Vl2PCY11oTK5mDms-NHXSGqFsKQ=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/oRPZKN6SL1SoMc5J7FQIHiA1C1wQZe1YfRHbkxaLnNp9Vi7Vl2PCY11oTK5mDms-NHXSGqFsKQ=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/oRPZKN6SL1SoMc5J7FQIHiA1C1wQZe1YfRHbkxaLnNp9Vi7Vl2PCY11oTK5mDms-NHXSGqFsKQ=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"I hope the mother who inspired this can hear it and feel her child close to her again.", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"410", + "label":"410 likes" + }, + "replyCount":1 + }, + { + "id":"UgyQEih224ElUkT2AXl4AaABAg", + "author":{ + "id":"UC7M3_B55yIvo4DZS3BvgA1g", + "name":"Sirce Guevara", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLRJhxg_aeXmbGuH8wbuCcGWVtRs6tFKPqkxw4-lcJ8=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLRJhxg_aeXmbGuH8wbuCcGWVtRs6tFKPqkxw4-lcJ8=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLRJhxg_aeXmbGuH8wbuCcGWVtRs6tFKPqkxw4-lcJ8=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"I cried watching this video, this is my first time seeing it.. It just reminded me of my mother, how she raised me alone. Seeing me happy and dancing all her life . How she works hard day by day just so I have a roof on my head and food on the table. She's amazing...", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"271", + "label":"271 likes" + }, + "replyCount":1 + }, + { + "id":"UgxSKtnwJ1fL1cGECFN4AaABAg", + "author":{ + "id":"UCaWu5P4tl4leNsq0d6K5JfA", + "name":"Brylee D", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSnWU59WluXZehM5VxmcbX6Unk_rgJc699gUp7lxw=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSnWU59WluXZehM5VxmcbX6Unk_rgJc699gUp7lxw=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSnWU59WluXZehM5VxmcbX6Unk_rgJc699gUp7lxw=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"I have a crush on that background wind instrument", + "published":"2 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"4.5K", + "label":"4.5K likes" + }, + "replyCount":36 + }, + { + "id":"Ugx885faaugZ-KS2ht14AaABAg", + "author":{ + "id":"UCAv-kFdFs9zZX4IR9y77sTg", + "name":"berry tart subs ✿", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/RIEhlWERKQrY6oscMFEVW9pyDVKwndKkfFfnMTGxJIFHV2np4asu1syE-C016cZlcgZYtkdvrCA=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/RIEhlWERKQrY6oscMFEVW9pyDVKwndKkfFfnMTGxJIFHV2np4asu1syE-C016cZlcgZYtkdvrCA=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/RIEhlWERKQrY6oscMFEVW9pyDVKwndKkfFfnMTGxJIFHV2np4asu1syE-C016cZlcgZYtkdvrCA=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"This song literally makes me cry every time I hear it it's just so sweet", + "published":"1 year ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"73", + "label":"73 likes" + }, + "replyCount":1 + }, + { + "id":"UgxfMf3PW8muQIKHeX54AaABAg", + "author":{ + "id":"UCs5_3PBRo9VoCCbDWDMpa-g", + "name":"Victor Rodriguez", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLRe_mumWc8G4a9DvzNQ7FBA_hctTvwTJskAdw=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLRe_mumWc8G4a9DvzNQ7FBA_hctTvwTJskAdw=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLRe_mumWc8G4a9DvzNQ7FBA_hctTvwTJskAdw=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"I hope my son can find some type of solace or message in this song one day. We lost his mother my wife when she passed suddenly three months ago at 23 years young. He was only 2 years old and 7 months when it happened. It was a short time for him but so many happy memories. They spent every single hour of every single day together. We’re so lost and devasted without you, We love you Deja C Rodriguez", + "published":"8 months ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"126", + "label":"126 likes" + }, + "replyCount":2 + }, + { + "id":"UgiuS-ehhcqhHXgCoAEC", + "author":{ + "id":"UCd6gX2dxkokyH70cbUocq7Q", + "name":"bunnyluveable", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSt6NFUcOAfGB1C0BL0f18q8sPUX0UQBhYV_A=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSt6NFUcOAfGB1C0BL0f18q8sPUX0UQBhYV_A=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLSt6NFUcOAfGB1C0BL0f18q8sPUX0UQBhYV_A=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"their music is like being wrapped in a warm blanket on a chilly day.", + "published":"5 years ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"563", + "label":"563 likes" + }, + "replyCount":6 + }, + { + "id":"UgwEdhuY0RUuiyBqpVN4AaABAg", + "author":{ + "id":"UC8GIfeF1UytnIdBUx7eODBg", + "name":"TheBnjmnMiles", + "thumbnails":[ + { + "url":"https://yt3.ggpht.com/ytc/AKedOLQjQG6jvrGnj9ejtjfO-pbXWwekST4e_qxK=s48-c-k-c0x00ffffff-no-rj", + "width":48, + "height":48 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLQjQG6jvrGnj9ejtjfO-pbXWwekST4e_qxK=s88-c-k-c0x00ffffff-no-rj", + "width":88, + "height":88 + }, + { + "url":"https://yt3.ggpht.com/ytc/AKedOLQjQG6jvrGnj9ejtjfO-pbXWwekST4e_qxK=s176-c-k-c0x00ffffff-no-rj", + "width":176, + "height":176 + } + ] + }, + "content":"Why is nobody talking about this kid’s freakin’ sweet dance moves?", + "published":"7 months ago", + "isLiked":false, + "authorIsChannelOwner":false, + "voteStatus":"INDIFFERENT", + "votes":{ + "simpleText":"210", + "label":"210 likes" + }, + "replyCount":4 + } + ] +} +``` + +
+ ## Dependencies - Thanks to [Encode](https://github.com/encode) for [httpx](https://github.com/encode/httpx). diff --git a/youtubesearchpython/__future__/__init__.py b/youtubesearchpython/__future__/__init__.py index 4d24b64..5299050 100644 --- a/youtubesearchpython/__future__/__init__.py +++ b/youtubesearchpython/__future__/__init__.py @@ -6,6 +6,6 @@ __title__ = 'youtube-search-python' -__version__ = '1.4.5' +__version__ = '1.6.0' __author__ = 'alexmercerind' __license__ = 'MIT' diff --git a/youtubesearchpython/__init__.py b/youtubesearchpython/__init__.py index b5fa9b7..d054cec 100644 --- a/youtubesearchpython/__init__.py +++ b/youtubesearchpython/__init__.py @@ -6,7 +6,7 @@ __title__ = 'youtube-search-python' -__version__ = '1.4.5' +__version__ = '1.6.0' __author__ = 'alexmercerind' __license__ = 'MIT'