frappe/env/lib/python3.12/site-packages/pyyoutube/api.py

2522 lines
99 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Main Api implementation.
"""
from typing import Optional, List, Union
import requests
from requests.auth import HTTPBasicAuth
from requests.models import Response
from requests_oauthlib.oauth2_session import OAuth2Session
from pyyoutube.error import ErrorCode, ErrorMessage, PyYouTubeException
from pyyoutube.models import (
AccessToken,
UserProfile,
ActivityListResponse,
CaptionListResponse,
ChannelListResponse,
ChannelSectionResponse,
PlaylistListResponse,
PlaylistItemListResponse,
VideoListResponse,
CommentThreadListResponse,
CommentListResponse,
VideoCategoryListResponse,
SearchListResponse,
SubscriptionListResponse,
I18nRegionListResponse,
I18nLanguageListResponse,
MemberListResponse,
MembershipsLevelListResponse,
VideoAbuseReportReasonListResponse,
)
from pyyoutube.utils.params_checker import enf_comma_separated, enf_parts
class Api(object):
"""
Example usage:
To create an instance of pyyoutube.Api class:
>>> import pyyoutube
>>> api = pyyoutube.Api(api_key="your api key")
To get one channel info:
>>> res = api.get_channel_info(channel_id="UC_x5XG1OV2P6uZZ5FSM9Ttw")
>>> print(res.items[0])
Now this api provide methods as follows:
>>> api.get_authorization_url()
>>> api.generate_access_token()
>>> api.refresh_token()
>>> api.get_channel_info()
>>> api.get_playlist_by_id()
>>> api.get_playlists()
>>> api.get_playlist_item_by_id()
>>> api.get_playlist_items()
>>> api.get_video_by_id()
>>> api.get_videos_by_chart()
>>> api.get_videos_by_myrating()
>>> api.get_comment_thread_by_id()
>>> api.get_comment_threads()
>>> api.get_comment_by_id()
>>> api.get_comments()
>>> api.get_video_categories()
>>> api.get_subscription_by_id()
>>> api.get_subscription_by_channel()
>>> api.get_subscription_by_me()
>>> api.get_activities_by_channel()
>>> api.get_activities_by_me()
>>> api.get_captions_by_video()
>>> api.get_channel_sections_by_id()
>>> api.get_channel_sections_by_channel()
>>> api.get_i18n_regions()
>>> api.get_i18n_languages()
>>> api.get_video_abuse_report_reason()
>>> api.search()
>>> api.search_by_keywords()
>>> api.search_by_developer()
>>> api.search_by_mine()
>>> api.search_by_related_video()
"""
BASE_URL = "https://www.googleapis.com/youtube/v3/"
AUTHORIZATION_URL = "https://accounts.google.com/o/oauth2/v2/auth"
EXCHANGE_ACCESS_TOKEN_URL = "https://oauth2.googleapis.com/token"
USER_INFO_URL = "https://www.googleapis.com/oauth2/v1/userinfo"
DEFAULT_REDIRECT_URI = "https://localhost/"
DEFAULT_SCOPE = [
"https://www.googleapis.com/auth/youtube",
"https://www.googleapis.com/auth/userinfo.profile",
]
DEFAULT_STATE = "PyYouTube"
DEFAULT_TIMEOUT = 10
DEFAULT_QUOTA = 10000 # this quota reset at 00:00:00(GMT-7) every day.
def __init__(
self,
client_id: Optional[str] = None,
client_secret: Optional[str] = None,
api_key: Optional[str] = None,
access_token: Optional[str] = None,
timeout: Optional[int] = None,
proxies: Optional[dict] = None,
) -> None:
"""
This Api provide two method to work. Use api key or use access token.
Args:
client_id(str, optional):
Your google app's ID.
client_secret (str, optional):
Your google app's secret.
api_key(str, optional):
The api key which you create from google api console.
access_token(str, optional):
If you not provide api key, you can do authorization to get an access token.
If all api key and access token provided. Use access token first.
timeout(int, optional):
The request timeout.
proxies(dict, optional):
If you want use proxy, need point this param.
param style like requests lib style.
Refer https://2.python-requests.org//en/latest/user/advanced/#proxies
Returns:
YouTube Api instance.
"""
self._client_id = client_id
self._client_secret = client_secret
self._api_key = api_key
self._access_token = access_token
self._refresh_token = None # This keep current user's refresh token.
self._timeout = timeout
self.session = requests.Session()
self.proxies = proxies
if not (
(self._client_id and self._client_secret)
or self._api_key
or self._access_token
):
raise PyYouTubeException(
ErrorMessage(
status_code=ErrorCode.MISSING_PARAMS,
message="Must specify either client key info or api key.",
)
)
if self._timeout is None:
self._timeout = self.DEFAULT_TIMEOUT
def _get_oauth_session(
self,
redirect_uri: Optional[str] = None,
scope: Optional[List[str]] = None,
**kwargs,
) -> OAuth2Session:
"""
Build a request session for OAuth.
Args:
redirect_uri(str, optional)
Determines how Google's authorization server sends a response to your app.
If not provide will use default https://localhost/
scope (list, optional)
The scope you want give permission.
If you not provide, will use default scope.
kwargs(dict, optional)
Some other params you want provide.
Returns:
OAuth2 Session
"""
if redirect_uri is None:
redirect_uri = self.DEFAULT_REDIRECT_URI
if scope is None:
scope = self.DEFAULT_SCOPE
return OAuth2Session(
client_id=self._client_id,
scope=scope,
redirect_uri=redirect_uri,
state=self.DEFAULT_STATE,
**kwargs,
)
def get_authorization_url(
self,
redirect_uri: Optional[str] = None,
scope: Optional[List[str]] = None,
**kwargs,
) -> (str, str):
"""
Build authorization url to do authorize.
Args:
redirect_uri(str, optional)
Determines how Google's authorization server sends a response to your app.
If not provide will use default https://localhost/
scope (list, optional)
The scope you want give permission.
If you not provide, will use default scope.
kwargs(dict, optional)
Some other params you want provide.
Returns:
The uri you can open on browser to do authorize.
"""
oauth_session = self._get_oauth_session(
redirect_uri=redirect_uri,
scope=scope,
**kwargs,
)
authorization_url, state = oauth_session.authorization_url(
self.AUTHORIZATION_URL,
access_type="offline",
prompt="select_account",
**kwargs,
)
return authorization_url, state
def generate_access_token(
self,
authorization_response: str,
redirect_uri: Optional[str] = None,
scope: Optional[List[str]] = None,
return_json: bool = False,
**kwargs,
) -> Union[dict, AccessToken]:
"""
Use the google auth response to get access token
Args:
authorization_response (str)
The response url which google redirect.
redirect_uri(str, optional)
Determines how Google's authorization server sends a response to your app.
If not provide will use default https://localhost/
scope (list, optional)
The scope you want give permission.
If you not provide, will use default scope.
return_json(bool, optional)
The return data type. If you set True JSON data will be returned.
False will return pyyoutube.AccessToken
kwargs(dict, optional)
Some other params you want provide.
Return:
Retrieved access token's info, pyyoutube.AccessToken instance.
"""
oauth_session = self._get_oauth_session(
redirect_uri=redirect_uri,
scope=scope,
**kwargs,
)
token = oauth_session.fetch_token(
self.EXCHANGE_ACCESS_TOKEN_URL,
client_secret=self._client_secret,
authorization_response=authorization_response,
proxies=self.proxies,
)
self._access_token = oauth_session.access_token
self._refresh_token = oauth_session.token["refresh_token"]
if return_json:
return token
else:
return AccessToken.from_dict(token)
def refresh_token(
self, refresh_token: Optional[str] = None, return_json: bool = False
) -> Union[dict, AccessToken]:
"""
Refresh token by api return refresh token.
Args:
refresh_token (str)
The refresh token which the api returns.
return_json (bool, optional):
If True JSON data will be returned, instead of pyyoutube.AccessToken
Return:
Retrieved new access token's info, pyyoutube.AccessToken instance.
"""
refresh_token = refresh_token if refresh_token else self._refresh_token
if refresh_token is None:
raise PyYouTubeException(
ErrorMessage(
status_code=ErrorCode.MISSING_PARAMS,
message=f"Must provide the refresh token or api has been authorized.",
)
)
oauth_session = OAuth2Session(client_id=self._client_id)
auth = HTTPBasicAuth(self._client_id, self._client_secret)
new_token = oauth_session.refresh_token(
self.EXCHANGE_ACCESS_TOKEN_URL,
refresh_token=refresh_token,
auth=auth,
)
self._access_token = oauth_session.access_token
if return_json:
return new_token
else:
return AccessToken.from_dict(new_token)
@staticmethod
def _parse_response(response: Response) -> dict:
"""
Parse response data and check whether errors exists.
Args:
response (Response)
The response which the request return.
Return:
response's data
"""
data = response.json()
if "error" in data:
raise PyYouTubeException(response)
return data
@staticmethod
def _parse_data(data: Optional[dict]) -> Union[dict, list]:
"""
Parse resp data.
Args:
data (dict)
The response data by response.json()
Return:
response's items
"""
items = data["items"]
return items
def _request(
self, resource, method=None, args=None, post_args=None, enforce_auth=True
) -> Response:
"""
Main request sender.
Args:
resource(str)
Resource field is which type data you want to retrieve.
Such as channels,videos and so on.
method(str, optional)
The method this request to send request.
Default is 'GET'
args(dict, optional)
The url params for this request.
post_args(dict, optional)
The Post params for this request.
enforce_auth(bool, optional)
Whether use google credentials
Returns:
response
"""
if method is None:
method = "GET"
if args is None:
args = dict()
if post_args is not None:
method = "POST"
key = None
access_token = None
if self._api_key is not None:
key = "key"
access_token = self._api_key
if self._access_token is not None:
key = "access_token"
access_token = self._access_token
if access_token is None and enforce_auth:
raise PyYouTubeException(
ErrorMessage(
status_code=ErrorCode.MISSING_PARAMS,
message="You must provide your credentials.",
)
)
if enforce_auth:
if method == "POST" and key not in post_args:
post_args[key] = access_token
elif method == "GET" and key not in args:
args[key] = access_token
try:
response = self.session.request(
method=method,
url=self.BASE_URL + resource,
timeout=self._timeout,
params=args,
data=post_args,
proxies=self.proxies,
)
except requests.HTTPError as e:
raise PyYouTubeException(
ErrorMessage(status_code=ErrorCode.HTTP_ERROR, message=e.args[0])
)
else:
return response
def get_profile(
self, access_token: Optional[str] = None, return_json: Optional[bool] = False
) -> Union[dict, UserProfile]:
"""
Get token user info.
Args:
access_token(str, optional)
user access token. If not provide, use api instance access token
return_json(bool, optional)
The return data type. If you set True JSON data will be returned.
False will return pyyoutube.UserProfile
Returns:
The data for you given access token's user info.
"""
if access_token is None:
access_token = self._access_token
if access_token is None:
raise PyYouTubeException(
ErrorMessage(
status_code=ErrorCode.MISSING_PARAMS,
message=f"Must provide the access token or api has been authorized.",
)
)
try:
response = self.session.get(
self.USER_INFO_URL,
params={"access_token": access_token},
timeout=self._timeout,
proxies=self.proxies,
)
except requests.HTTPError as e:
raise PyYouTubeException(
ErrorMessage(status_code=ErrorCode.HTTP_ERROR, message=e.args[0])
)
data = self._parse_response(response)
if return_json:
return data
else:
return UserProfile.from_dict(data)
def paged_by_page_token(
self,
resource: str,
args: dict,
count: Optional[int] = None,
):
"""
Response paged by response's page token. If not provide response token
Args:
resource (str):
The resource string need to retrieve data.
args (dict)
The args for api.
count (int, optional):
The count for result items you want to get.
If provide this with None, will retrieve all items.
Note:
The all items maybe too much. Notice your app's cost.
Returns:
Data api origin response.
"""
res_data: Optional[dict] = None
current_items: List[dict] = []
page_token: Optional[str] = None
now_items_count: int = 0
while True:
if page_token is not None:
args["pageToken"] = page_token
resp = self._request(resource=resource, method="GET", args=args)
data = self._parse_response(resp) # origin response
# set page token
page_token = data.get("nextPageToken")
prev_page_token = data.get("prevPageToken")
# parse results.
items = self._parse_data(data)
current_items.extend(items)
now_items_count += len(items)
if res_data is None:
res_data = data
# first check the count if satisfies.
if count is not None:
if now_items_count >= count:
current_items = current_items[:count]
break
# if have no page token, mean no more data.
if page_token is None:
break
res_data["items"] = current_items
# use last request page token
res_data["nextPageToken"] = page_token
res_data["prevPageToken"] = prev_page_token
return res_data
def get_activities_by_channel(
self,
*,
channel_id: str,
parts: Optional[Union[str, list, tuple, set]] = None,
before: Optional[str] = None,
after: Optional[str] = None,
region_code: Optional[str] = None,
count: Optional[int] = 20,
limit: int = 20,
page_token: Optional[str] = None,
return_json: bool = False,
):
"""
Retrieve given channel's activities data.
Args:
channel_id (str):
The id for channel which you want to get activities data.
parts ((str,list,tuple,set) optional):
The resource parts for activities you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
before (str, optional):
Set this will only return the activities occurred before this timestamp.
This need specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.
after (str, optional):
Set this will only return the activities occurred after this timestamp.
This need specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.
region_code (str, optional):
Set this will only return the activities for the specified country.
This need specified with an ISO 3166-1 alpha-2 country code.
count (int, optional):
The count will retrieve activities data.
Default is 20.
If provide this with None, will retrieve all activities.
limit (int, optional):
The maximum number of items each request retrieve.
For activities, this should not be more than 50.
Default is 20.
page_token (str, optional):
The token of the page of activities result to retrieve.
You can use this retrieve point result page directly.
And you should know about the page result set for YouTube.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.ActivityListResponse instance.
Returns:
ActivityListResponse or original data.
"""
if count is None:
limit = 50 # for activities the max limit for per request is 50
else:
limit = min(count, limit)
args = {
"channelId": channel_id,
"part": enf_parts(resource="activities", value=parts),
"maxResults": limit,
}
if before:
args["publishedBefore"] = before
if after:
args["publishedAfter"] = after
if region_code:
args["regionCode"] = region_code
if page_token is not None:
args["pageToken"] = page_token
res_data = self.paged_by_page_token(
resource="activities", args=args, count=count
)
if return_json:
return res_data
else:
return ActivityListResponse.from_dict(res_data)
def get_activities_by_me(
self,
*,
parts: Optional[Union[str, list, tuple, set]] = None,
before: Optional[str] = None,
after: Optional[str] = None,
region_code: Optional[str] = None,
count: Optional[int] = 20,
limit: int = 20,
page_token: Optional[str] = None,
return_json: bool = False,
):
"""
Retrieve authorized user's activities.
Note:
This need you do authorize first.
Args:
parts ((str,list,tuple,set) optional):
The resource parts for activities you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
before (str, optional):
Set this will only return the activities occurred before this timestamp.
This need specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.
after (str, optional):
Set this will only return the activities occurred after this timestamp.
This need specified in ISO 8601 (YYYY-MM-DDThh:mm:ss.sZ) format.
region_code (str, optional):
Set this will only return the activities for the specified country.
This need specified with an ISO 3166-1 alpha-2 country code.
count (int, optional):
The count will retrieve activities data.
Default is 20.
If provide this with None, will retrieve all activities.
limit (int, optional):
The maximum number of items each request retrieve.
For activities, this should not be more than 50.
Default is 20.
page_token (str, optional):
The token of the page of activities result to retrieve.
You can use this retrieve point result page directly.
And you should know about the page result set for YouTube.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.ActivityListResponse instance.
Returns:
ActivityListResponse or original data.
"""
if count is None:
limit = 50 # for activities the max limit for per request is 50
else:
limit = min(count, limit)
args = {
"mine": True,
"part": enf_parts(resource="activities", value=parts),
"maxResults": limit,
}
if before:
args["publishedBefore"] = before
if after:
args["publishedAfter"] = after
if region_code:
args["regionCode"] = region_code
if page_token is not None:
args["pageToken"] = page_token
res_data = self.paged_by_page_token(
resource="activities", args=args, count=count
)
if return_json:
return res_data
else:
return ActivityListResponse.from_dict(res_data)
def get_captions_by_video(
self,
*,
video_id: str,
parts: Optional[Union[str, list, tuple, set]] = None,
caption_id: Optional[Union[str, list, tuple, set]] = None,
return_json: bool = False,
):
"""
Retrieve authorized user's video's caption data.
Note:
This need you do authorize first.
Args:
video_id (str):
The id for video which you want to get caption.
parts ((str,list,tuple,set) optional):
The resource parts for caption you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
caption_id ((str,list,tuple,set)):
The id for caption that you want to get data.
You can pass this with single id str,comma-separated id str, or list, tuple, set of id str.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.CaptionListResponse instance.
Returns:
CaptionListResponse or original data.
"""
args = {
"videoId": video_id,
"part": enf_parts("captions", parts),
}
if caption_id is not None:
args["id"] = enf_comma_separated("caption_id", caption_id)
resp = self._request(resource="captions", method="GET", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return CaptionListResponse.from_dict(data)
def get_channel_info(
self,
*,
channel_id: Optional[Union[str, list, tuple, set]] = None,
for_username: Optional[str] = None,
mine: Optional[bool] = None,
parts: Optional[Union[str, list, tuple, set]] = None,
hl: str = "en_US",
return_json: Optional[bool] = False,
):
"""
Retrieve channel data from YouTube Data API.
Note:
1. Don't know why, but now you couldn't get channel list by given an guide category.
You can only get list by parameters mine,forUsername,id.
Refer: https://developers.google.com/youtube/v3/guides/implementation/channels
2. The origin maxResult param not work for these filter method.
Args:
channel_id ((str,list,tuple,set), optional):
The id or comma-separated id string for youtube channel which you want to get.
You can also pass this with an id list, tuple, set.
for_username (str, optional):
The name for YouTube username which you want to get.
Note: This name may the old youtube version's channel's user's username, Not the the channel name.
Refer: https://developers.google.com/youtube/v3/guides/working_with_channel_ids
mine (bool, optional):
If you have give the authorization. Will return your channels.
Must provide the access token.
parts (str, optional):
Comma-separated list of one or more channel resource properties.
If not provided. will use default public properties.
hl (str, optional):
If provide this. Will return channel's language localized info.
This value need https://developers.google.com/youtube/v3/docs/i18nLanguages.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.ChannelListResponse instance.
Returns:
ChannelListResponse instance or original data.
"""
args = {
"part": enf_parts(resource="channels", value=parts),
"hl": hl,
}
if for_username is not None:
args["forUsername"] = for_username
elif channel_id is not None:
args["id"] = enf_comma_separated("channel_id", channel_id)
elif mine is not None:
args["mine"] = mine
else:
raise PyYouTubeException(
ErrorMessage(
status_code=ErrorCode.MISSING_PARAMS,
message=f"Specify at least one of channel_id,channel_name or mine",
)
)
resp = self._request(resource="channels", method="GET", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return ChannelListResponse.from_dict(data)
def get_channel_sections_by_id(
self,
*,
section_id: Union[str, list, tuple, set],
parts: Optional[Union[str, list, tuple, set]] = None,
return_json: Optional[bool] = False,
) -> Union[ChannelSectionResponse, dict]:
"""
Retrieve channel section info by his ids(s).
Args:
section_id:
The id(s) for channel sections.
You can pass this with single id str, comma-separated id str, or a list,tuple,set of ids.
parts:
The resource parts for channel section you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
return_json:
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.ChannelSectionResponse instance.
Returns:
ChannelSectionResponse or original data.
"""
args = {
"id": enf_comma_separated(field="section_id", value=section_id),
"part": enf_parts(resource="channelSections", value=parts),
}
resp = self._request(resource="channelSections", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return ChannelSectionResponse.from_dict(data)
def get_channel_sections_by_channel(
self,
*,
channel_id: Optional[str] = None,
mine: bool = False,
parts: Optional[Union[str, list, tuple, set]] = None,
return_json: Optional[bool] = False,
) -> Union[ChannelSectionResponse, dict]:
"""
Retrieve channel sections by channel id.
Args:
channel_id:
The id for channel which you want to get channel sections.
mine:
If you want to get your channel's sections, set this with True.
And this need your authorization.
parts:
The resource parts for channel section you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
return_json:
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.ChannelSectionResponse instance.
Returns:
ChannelSectionResponse or original data.
"""
args = {
"part": enf_parts(resource="channelSections", value=parts),
}
if mine:
args["mine"] = mine
else:
args["channelId"] = channel_id
resp = self._request(resource="channelSections", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return ChannelSectionResponse.from_dict(data)
def get_comment_by_id(
self,
*,
comment_id: Union[str, list, tuple, set],
parts: Optional[Union[str, list, tuple, set]] = None,
text_format: Optional[str] = "html",
return_json: Optional[bool] = False,
):
"""
Retrieve comment info by given comment id str.
Args:
comment_id (str, optional):
The id for comment that you want to retrieve data.
You can pass this with single id str, comma-separated id str, or a list,tuple,set of ids.
parts ((str,list,tuple,set), optional):
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
text_format (str, optional):
Comments left by users format style.
Acceptable values are: html, plainText.
Default is html.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.CommentListResponse instance.
Returns:
CommentListResponse or original data
"""
args = {
"id": enf_comma_separated(field="comment_id", value=comment_id),
"part": enf_parts(resource="comments", value=parts),
"textFormat": text_format,
}
resp = self._request(resource="comments", method="GET", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return CommentListResponse.from_dict(data)
def get_comments(
self,
*,
parent_id: str,
parts: Optional[Union[str, list, tuple, set]] = None,
text_format: Optional[str] = "html",
count: Optional[int] = 20,
limit: Optional[int] = 20,
page_token: Optional[str] = None,
return_json: Optional[bool] = False,
):
"""
Retrieve comments info by given parent id.
Note: YouTube currently supports replies only for top-level comments.
However, replies to replies may be supported in the future.
Args:
parent_id (str):
Provide the ID of the comment for which replies should be retrieved.
parts ((str,list,tuple,set), optional):
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
text_format (str, optional):
Comments left by users format style.
Acceptable values are: html, plainText.
Default is html.
count (int, optional):
The count will retrieve videos data.
Default is 20.
If provide this with None, will retrieve all comments.
limit (int, optional):
The maximum number of items each request retrieve.
For comments, this should not be more than 100.
Default is 20.
page_token(str, optional):
The token of the page of comments result to retrieve.
You can use this retrieve point result page directly.
And you should know about the the result set for YouTube.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.CommentListResponse instance.
Returns:
CommentListResponse or original data
"""
if count is None:
limit = 100 # for comments the max limit for per request is 100
else:
limit = min(count, limit)
args = {
"parentId": parent_id,
"part": enf_parts(resource="comments", value=parts),
"textFormat": text_format,
"maxResults": limit,
}
if page_token is not None:
args["pageToken"] = page_token
res_data = self.paged_by_page_token(resource="comments", args=args, count=count)
if return_json:
return res_data
else:
return CommentListResponse.from_dict(res_data)
def get_comment_thread_by_id(
self,
*,
comment_thread_id: Union[str, list, tuple, set],
parts: Optional[Union[str, list, tuple, set]] = None,
text_format: Optional[str] = "html",
return_json: Optional[bool] = False,
):
"""
Retrieve the comment thread info by given id.
Args:
comment_thread_id ((str,list,tuple,set)):
The id for comment thread that you want to retrieve data.
You can pass this with single id str, comma-separated id str, or a list,tuple,set of ids.
parts ((str,list,tuple,set), optional):
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
text_format (str, optional):
Comments left by users format style.
Acceptable values are: html, plainText.
Default is html.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.CommentThreadListResponse instance.
Returns:
CommentThreadListResponse or original data
"""
args = {
"id": enf_comma_separated("comment_thread_id", comment_thread_id),
"part": enf_parts(resource="commentThreads", value=parts),
"textFormat": text_format,
}
resp = self._request(resource="commentThreads", method="GET", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return CommentThreadListResponse.from_dict(data)
def get_comment_threads(
self,
*,
all_to_channel_id: Optional[str] = None,
channel_id: Optional[str] = None,
video_id: Optional[str] = None,
parts: Optional[Union[str, list, tuple, set]] = None,
moderation_status: Optional[str] = None,
order: Optional[str] = None,
search_terms: Optional[str] = None,
text_format: Optional[str] = "html",
count: Optional[int] = 20,
limit: Optional[int] = 20,
page_token: Optional[str] = None,
return_json: Optional[bool] = False,
):
"""
Retrieve the comment threads info by given filter condition.
Args:
all_to_channel_id (str, optional):
If you provide this with a channel id, will return all comment threads associated with the channel.
The response can include comments about the channel or about the channel's videos.
channel_id (str, optional):
If you provide this with a channel id, will return the comment threads associated with the channel.
But the response not include comments about the channel's videos.
video_id (str, optional):
If you provide this with a video id, will return the comment threads associated with the video.
parts ((str,list,tuple,set), optional)
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
moderation_status (str, optional):
This parameter must used with authorization.
If you provide this. the response will return comment threads match this filter only.
Acceptable values are:
- heldForReview: Retrieve comment threads that are awaiting review by a moderator.
- likelySpam: Retrieve comment threads classified as likely to be spam.
- published: Retrieve threads of published comments. this is default for all.
See more: https://developers.google.com/youtube/v3/docs/commentThreads/list#parameters
order (str, optional):
Order parameter specifies the order in which the API response should list comment threads.
Acceptable values are:
- time: Comment threads are ordered by time. This is the default behavior.
- relevance: Comment threads are ordered by relevance.
search_terms (str, optional):
The searchTerms parameter instructs the API to limit the API response to only contain comments
that contain the specified search terms.
text_format (str, optional):
Comments left by users format style.
Acceptable values are: html, plainText.
Default is html.
count (int, optional):
The count will retrieve comment threads data.
Default is 20.
If provide this with None, will retrieve all comment threads.
limit (int, optional):
The maximum number of items each request retrieve.
For comment threads, this should not be more than 100.
Default is 20.
page_token(str, optional):
The token of the page of commentThreads result to retrieve.
You can use this retrieve point result page directly.
And you should know about the the result set for YouTube.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.CommentThreadListResponse instance.
Returns:
CommentThreadListResponse or original data
"""
if count is None:
limit = 100 # for commentThreads the max limit for per request is 100
else:
limit = min(count, limit)
args = {
"part": enf_parts(resource="commentThreads", value=parts),
"maxResults": limit,
"textFormat": text_format,
}
if all_to_channel_id:
args["allThreadsRelatedToChannelId"] = (all_to_channel_id,)
elif channel_id:
args["channelId"] = channel_id
elif video_id:
args["videoId"] = video_id
else:
raise PyYouTubeException(
ErrorMessage(
status_code=ErrorCode.MISSING_PARAMS,
message=f"Specify at least one of all_to_channel_id, channel_id or video_id",
)
)
if moderation_status:
args["moderationStatus"] = moderation_status
if order:
args["order"] = order
if search_terms:
args["searchTerms"] = search_terms
if page_token is not None:
args["pageToken"] = page_token
res_data = self.paged_by_page_token(
resource="commentThreads", args=args, count=count
)
if return_json:
return res_data
else:
return CommentThreadListResponse.from_dict(res_data)
def get_i18n_languages(
self,
*,
parts: Optional[Union[str, list, tuple, set]] = None,
hl: Optional[str] = "en_US",
return_json: Optional[bool] = False,
) -> Union[I18nLanguageListResponse, dict]:
"""
Returns a list of application languages that the YouTube website supports.
Args:
parts:
The resource parts for i18n language you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
hl:
If provide this. Will return i18n language's language localized info.
This value need https://developers.google.com/youtube/v3/docs/i18nLanguages.
return_json:
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.I18nLanguageListResponse instance.
Returns:
I18nLanguageListResponse or original data.
"""
args = {"hl": hl, "part": enf_parts(resource="i18nLanguages", value=parts)}
resp = self._request(resource="i18nLanguages", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return I18nLanguageListResponse.from_dict(data)
def get_i18n_regions(
self,
*,
parts: Optional[Union[str, list, tuple, set]] = None,
hl: Optional[str] = "en_US",
return_json: Optional[bool] = False,
) -> Union[I18nRegionListResponse, dict]:
"""
Retrieve all available regions.
Args:
parts:
The resource parts for i18n region you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
hl:
If provide this. Will return i18n region's language localized info.
This value need https://developers.google.com/youtube/v3/docs/i18nLanguages.
return_json:
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.I18nRegionListResponse instance.
Returns:
I18nRegionListResponse or origin data
"""
args = {"hl": hl, "part": enf_parts(resource="i18nRegions", value=parts)}
resp = self._request(resource="i18nRegions", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return I18nRegionListResponse.from_dict(data)
def get_members(
self,
*,
parts: Optional[Union[str, list, tuple, set]] = None,
mode: Optional[str] = "all_current",
count: Optional[int] = 5,
limit: Optional[int] = 5,
page_token: Optional[str] = None,
has_access_to_level: Optional[str] = None,
filter_by_member_channel_id: Optional[Union[str, list, tuple, set]] = None,
return_json: Optional[bool] = False,
) -> Union[MemberListResponse, dict]:
"""
Retrieve a list of members for a channel.
Args:
parts ((str,list,tuple,set) optional):
The resource parts for member you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
mode:
The mode parameter indicates which members will be included in the API response.
Set the parameter value to one of the following values:
- all_current (default): List current members, from newest to oldest. When this value is used,
the end of the list is reached when the API response does not contain a nextPageToken.
- updates : List only members that joined or upgraded since the previous API call.
Note: The first call starts a new stream of updates but does not actually return any members.
To start retrieving the membership updates, you need to poll the endpoint using the
nextPageToken at your desired frequency.
Note that when this value is used, the API response always contains a nextPageToken.
count (int, optional):
The count will retrieve videos data.
Default is 5.
limit (int, optional):
The maximum number of items each request retrieve.
For members, this should not be more than 1000.
Default is 5.
page_token (str, optional):
The token of the page of search result to retrieve.
You can use this retrieve point result page directly.
And you should know about the the result set for YouTube.
has_access_to_level (str, optional):
The hasAccessToLevel parameter value is a level ID that specifies the minimum level
that members in the result set should have.
filter_by_member_channel_id ((str,list,tuple,set) optional):
A list of channel IDs that can be used to check the membership status of specific users.
A maximum of 100 channels can be specified per call.
return_json (bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.MemberListResponse instance.
Returns:
MemberListResponse or original data
"""
if count is None:
limit = 1000
else:
limit = min(count, limit)
args = {
"part": enf_parts(resource="members", value=parts),
"maxResults": limit,
}
if mode:
args["mode"] = mode
if page_token is not None:
args["pageToken"] = page_token
if has_access_to_level:
args["hasAccessToLevel"] = has_access_to_level
if filter_by_member_channel_id:
args["filterByMemberChannelId"] = enf_parts(
resource="filterByMemberChannelId",
value=filter_by_member_channel_id,
check=False,
)
res_data = self.paged_by_page_token(
resource="members",
args=args,
count=count,
)
if return_json:
return res_data
else:
return MemberListResponse.from_dict(res_data)
def get_membership_levels(
self,
*,
parts: Optional[Union[str, list, tuple, set]] = None,
return_json: Optional[bool] = False,
) -> Union[MembershipsLevelListResponse, dict]:
"""
Retrieve membership levels for a channel
Notes:
This requires your authorization.
Args:
parts ((str,list,tuple,set) optional):
The resource parts for membership level you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
return_json (bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.MembershipsLevelListResponse instance.
Returns:
MembershipsLevelListResponse or original data
"""
args = {
"part": enf_parts(resource="membershipsLevels", value=parts),
}
resp = self._request(resource="membershipsLevels", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return MembershipsLevelListResponse.from_dict(data)
def get_playlist_item_by_id(
self,
*,
playlist_item_id: Union[str, list, tuple, set],
parts: Optional[Union[str, list, tuple, set]] = None,
return_json: Optional[bool] = False,
):
"""
Retrieve playlist Items info by your given id
Args:
playlist_item_id ((str,list,tuple,set)):
The id for playlist item that you want to retrieve info.
You can pass this with single id str, comma-separated id str.
Or a list,tuple,set of ids.
parts ((str,list,tuple,set) optional):
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.PlayListItemApiResponse instance.
Returns:
PlaylistItemListResponse or original data
"""
args = {
"id": enf_comma_separated("playlist_item_id", playlist_item_id),
"part": enf_parts(resource="playlistItems", value=parts),
}
resp = self._request(resource="playlistItems", method="GET", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return PlaylistItemListResponse.from_dict(data)
def get_playlist_items(
self,
*,
playlist_id: str,
parts: Optional[Union[str, list, tuple, set]] = None,
video_id: Optional[str] = None,
count: Optional[int] = 5,
limit: Optional[int] = 5,
page_token: Optional[str] = None,
return_json: Optional[bool] = False,
):
"""
Retrieve playlist Items info by your given playlist id
Args:
playlist_id (str):
The id for playlist that you want to retrieve items data.
parts ((str,list,tuple,set) optional):
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
video_id (str, Optional):
Specifies that the request should return only the playlist items that contain the specified video.
count (int, optional):
The count will retrieve playlist items data.
Default is 5.
If provide this with None, will retrieve all playlist items.
limit (int, optional):
The maximum number of items each request retrieve.
For playlistItem, this should not be more than 50.
Default is 5
page_token(str, optional):
The token of the page of playlist items result to retrieve.
You can use this retrieve point result page directly.
And you should know about the the result set for YouTube.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.PlayListItemApiResponse instance.
Returns:
PlaylistItemListResponse or original data
"""
if count is None:
limit = 50 # for playlistItems the max limit for per request is 50
else:
limit = min(count, limit)
args = {
"playlistId": playlist_id,
"part": enf_parts(resource="playlistItems", value=parts),
"maxResults": limit,
}
if video_id is not None:
args["videoId"] = video_id
if page_token is not None:
args["pageToken"] = page_token
res_data = self.paged_by_page_token(
resource="playlistItems", args=args, count=count
)
if return_json:
return res_data
else:
return PlaylistItemListResponse.from_dict(res_data)
def get_playlist_by_id(
self,
*,
playlist_id: Union[str, list, tuple, set],
parts: Optional[Union[str, list, tuple, set]] = None,
hl: Optional[str] = "en_US",
return_json: Optional[bool] = False,
):
"""
Retrieve playlist data by given playlist id.
Args:
playlist_id ((str,list,tuple,set)):
The id for playlist that you want to retrieve data.
You can pass this with single id str,comma-separated id str, or list, tuple, set of id str.
parts (str, optional):
Comma-separated list of one or more playlist resource properties.
You can also pass this with list, tuple, set of part str.
If not provided. will use default public properties.
hl (str, optional):
If provide this. Will return playlist's language localized info.
This value need https://developers.google.com/youtube/v3/docs/i18nLanguages.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.PlaylistListResponse instance
Returns:
PlaylistListResponse or original data
"""
args = {
"id": enf_comma_separated("playlist_id", playlist_id),
"part": enf_parts(resource="playlists", value=parts),
"hl": hl,
}
resp = self._request(resource="playlists", method="GET", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return PlaylistListResponse.from_dict(data)
def get_playlists(
self,
*,
channel_id: Optional[str] = None,
mine: Optional[bool] = None,
parts: Optional[Union[str, list, tuple, set]] = None,
count: Optional[int] = 5,
limit: Optional[int] = 5,
hl: Optional[str] = "en_US",
page_token: Optional[str] = None,
return_json: Optional[bool] = False,
):
"""
Retrieve channel playlists info from youtube data api.
Args:
channel_id (str, optional):
If provide channel id, this will return pointed channel's playlist info.
mine (bool, optional):
If you have given the authorization. Will return your playlists.
Must provide the access token.
parts (str, optional):
Comma-separated list of one or more playlist resource properties.
You can also pass this with list, tuple, set of part str.
If not provided. will use default public properties.
count (int, optional):
The count will retrieve playlist data.
Default is 5.
If provide this with None, will retrieve all playlists.
limit (int, optional):
The maximum number of items each request to retrieve.
For playlist, this should not be more than 50.
Default is 5
hl (str, optional):
If provide this. Will return playlist's language localized info.
This value need https://developers.google.com/youtube/v3/docs/i18nLanguages.
page_token(str, optional):
The token of the page of playlists result to retrieve.
You can use this retrieve point result page directly.
And you should know about the the result set for YouTube.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.PlaylistListResponse instance.
Returns:
PlaylistListResponse or original data
"""
if count is None:
limit = 50 # for playlists the max limit for per request is 50
else:
limit = min(count, limit)
args = {
"part": enf_parts(resource="playlists", value=parts),
"hl": hl,
"maxResults": limit,
}
if channel_id is not None:
args["channelId"] = channel_id
elif mine is not None:
args["mine"] = mine
else:
raise PyYouTubeException(
ErrorMessage(
status_code=ErrorCode.MISSING_PARAMS,
message=f"Specify at least one of channel_id,playlist_id or mine",
)
)
if page_token is not None:
args["pageToken"] = page_token
res_data = self.paged_by_page_token(
resource="playlists", args=args, count=count
)
if return_json:
return res_data
else:
return PlaylistListResponse.from_dict(res_data)
def search(
self,
*,
parts: Optional[Union[str, list, tuple, set]] = None,
for_developer: Optional[bool] = None,
for_mine: Optional[bool] = None,
related_to_video_id: Optional[str] = None,
channel_id: Optional[str] = None,
channel_type: Optional[str] = None,
event_type: Optional[str] = None,
location: Optional[str] = None,
location_radius: Optional[str] = None,
count: Optional[int] = 10,
limit: Optional[int] = 10,
order: Optional[str] = None,
published_after: Optional[str] = None,
published_before: Optional[str] = None,
q: Optional[str] = None,
region_code: Optional[str] = None,
relevance_language: Optional[str] = None,
safe_search: Optional[str] = None,
topic_id: Optional[str] = None,
search_type: Optional[Union[str, list, tuple, set]] = None,
video_caption: Optional[str] = None,
video_category_id: Optional[str] = None,
video_definition: Optional[str] = None,
video_dimension: Optional[str] = None,
video_duration: Optional[str] = None,
video_embeddable: Optional[str] = None,
video_license: Optional[str] = None,
video_syndicated: Optional[str] = None,
video_type: Optional[str] = None,
page_token: Optional[str] = None,
return_json: Optional[bool] = False,
) -> Union[SearchListResponse, dict]:
"""
Main search api implementation.
You can find all parameters description at https://developers.google.com/youtube/v3/docs/search/list#parameters
Returns:
SearchListResponse or original data
"""
parts = enf_parts(resource="search", value=parts)
if search_type is None:
search_type = "video,channel,playlist"
else:
search_type = enf_comma_separated(field="search_type", value=search_type)
args = {
"part": parts,
"maxResults": min(limit, count),
}
if for_developer:
args["forDeveloper"] = for_developer
if for_mine:
args["forMine"] = for_mine
if related_to_video_id:
args["relatedToVideoId"] = related_to_video_id
if channel_id:
args["channelId"] = channel_id
if channel_type:
args["channelType"] = channel_type
if event_type:
args["eventType"] = event_type
if location:
args["location"] = location
if location_radius:
args["locationRadius"] = location_radius
if order:
args["order"] = order
if published_after:
args["publishedAfter"] = published_after
if published_before:
args["publishedBefore"] = published_before
if q:
args["q"] = q
if region_code:
args["regionCode"] = region_code
if relevance_language:
args["relevanceLanguage"] = relevance_language
if safe_search:
args["safeSearch"] = safe_search
if topic_id:
args["topicId"] = topic_id
if search_type:
args["type"] = search_type
if video_caption:
args["videoCaption"] = video_caption
if video_category_id:
args["videoCategoryId"] = video_category_id
if video_definition:
args["videoDefinition"] = video_definition
if video_dimension:
args["videoDimension"] = video_dimension
if video_duration:
args["videoDuration"] = video_duration
if video_embeddable:
args["videoEmbeddable"] = video_embeddable
if video_license:
args["videoLicense"] = video_license
if video_syndicated:
args["videoSyndicated"] = video_syndicated
if video_type:
args["videoType"] = video_type
if page_token:
args["pageToken"] = page_token
res_data = self.paged_by_page_token(resource="search", args=args, count=count)
if return_json:
return res_data
else:
return SearchListResponse.from_dict(res_data)
def search_by_keywords(
self,
*,
q: Optional[str],
parts: Optional[Union[str, list, tuple, set]] = None,
search_type: Optional[Union[str, list, tuple, set]] = None,
count: Optional[int] = 25,
limit: Optional[int] = 25,
page_token: Optional[str] = None,
return_json: Optional[bool] = False,
**kwargs: Optional[dict],
) -> Union[SearchListResponse, dict]:
"""
This is simplest usage for search api. You can only passed the keywords to retrieve data from YouTube.
And the result will include videos,playlists and channels.
Note: A call to this method has a quota cost of 100 units.
Args:
q (str):
Your keywords can also use the Boolean NOT (-) and OR (|) operators to exclude videos or
to find videos that are associated with one of several search terms. For example,
to search for videos matching either "boating" or "sailing",
set the q parameter value to boating|sailing. Similarly,
to search for videos matching either "boating" or "sailing" but not "fishing",
set the q parameter value to boating|sailing -fishing.
Note that the pipe character must be URL-escaped when it is sent in your API request.
The URL-escaped value for the pipe character is %7C.
parts ((str,list,tuple,set) optional):
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
search_type ((str,list,tuple,set), optional):
Parameter restricts a search query to only retrieve a particular type of resource.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
The default value is video,channel,playlist
Acceptable values are:
- channel
- playlist
- video
count (int, optional):
The count will retrieve videos data.
Default is 25.
limit (int, optional):
The maximum number of items each request retrieve.
For search, this should not be more than 50.
Default is 25.
page_token (str, optional):
The token of the page of search result to retrieve.
You can use this retrieve point result page directly.
And you should know about the the result set for YouTube.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.SearchListResponse instance.
kwargs:
If you want use this pass more args. You can use this.
Returns:
SearchListResponse or original data
"""
return self.search(
parts=parts,
q=q,
search_type=search_type,
count=count,
limit=limit,
page_token=page_token,
return_json=return_json,
**kwargs,
)
def search_by_developer(
self,
*,
parts: Optional[Union[str, list, tuple, set]],
q: Optional[str] = None,
count: Optional[int] = 25,
limit: Optional[int] = 25,
page_token: Optional[str] = None,
return_json: Optional[bool] = False,
**kwargs,
) -> Union[SearchListResponse, dict]:
"""
Parameter restricts the search to only retrieve videos uploaded via the developer's application or website.
Args:
parts:
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
q:
Your keywords can also use the Boolean NOT (-) and OR (|) operators to exclude videos or
to find videos that are associated with one of several search terms. For example,
to search for videos matching either "boating" or "sailing",
set the q parameter value to boating|sailing. Similarly,
to search for videos matching either "boating" or "sailing" but not "fishing",
set the q parameter value to boating|sailing -fishing.
Note that the pipe character must be URL-escaped when it is sent in your API request.
The URL-escaped value for the pipe character is %7C.
count:
The count will retrieve videos data.
Default is 25.
limit:
The maximum number of items each request retrieve.
For search, this should not be more than 50.
Default is 25.
page_token:
The token of the page of search result to retrieve.
You can use this retrieve point result page directly.
And you should know about the the result set for YouTube.
return_json:
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.SearchListResponse instance.
kwargs:
If you want use this pass more args. You can use this.
Returns:
SearchListResponse or original data
"""
return self.search(
for_developer=True,
search_type="video",
parts=parts,
q=q,
count=count,
limit=limit,
page_token=page_token,
return_json=return_json,
**kwargs,
)
def search_by_mine(
self,
*,
parts: Optional[Union[str, list, tuple, set]],
q: Optional[str] = None,
count: Optional[int] = 25,
limit: Optional[int] = 25,
page_token: Optional[str] = None,
return_json: Optional[bool] = False,
**kwargs,
) -> Union[SearchListResponse, dict]:
"""
Parameter restricts the search to only retrieve videos owned by the authenticated user.
Note:
This methods can not use following parameters:
video_definition, video_dimension, video_duration, video_license,
video_embeddable, video_syndicated, video_type.
Args:
q:
Your keywords can also use the Boolean NOT (-) and OR (|) operators to exclude videos or
to find videos that are associated with one of several search terms. For example,
to search for videos matching either "boating" or "sailing",
set the q parameter value to boating|sailing. Similarly,
to search for videos matching either "boating" or "sailing" but not "fishing",
set the q parameter value to boating|sailing -fishing.
Note that the pipe character must be URL-escaped when it is sent in your API request.
The URL-escaped value for the pipe character is %7C.
parts ((str,list,tuple,set) optional):
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
count (int, optional):
The count will retrieve videos data.
Default is 25.
limit (int, optional):
The maximum number of items each request retrieve.
For search, this should not be more than 50.
Default is 25.
page_token (str, optional):
The token of the page of search result to retrieve.
You can use this retrieve point result page directly.
And you should know about the the result set for YouTube.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.SearchListResponse instance.
kwargs:
If you want use this pass more args. You can use this.
Returns:
SearchListResponse or original data
"""
return self.search(
for_mine=True,
search_type="video",
parts=parts,
q=q,
count=count,
limit=limit,
page_token=page_token,
return_json=return_json,
**kwargs,
)
def search_by_related_video(
self,
*,
related_to_video_id: str,
parts: Optional[Union[str, list, tuple, set]] = None,
region_code: Optional[str] = None,
relevance_language: Optional[str] = None,
safe_search: Optional[str] = None,
count: Optional[int] = 25,
limit: Optional[int] = 25,
page_token: Optional[str] = None,
return_json: Optional[bool] = False,
) -> Union[SearchListResponse, dict]:
"""
Retrieve a list of videos related to that video.
Args:
related_to_video_id:
A YouTube video ID which result associated with.
parts:
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
region_code:
Parameter instructs the API to return search results for videos
that can be viewed in the specified country.
relevance_language:
Parameter instructs the API to return search results that are most relevant to the specified language.
safe_search:
Parameter indicates whether the search results should include restricted content
as well as standard content.
Acceptable values are:
- moderate – YouTube will filter some content from search results and, at the least,
will filter content that is restricted in your locale. Based on their content,
search results could be removed from search results or demoted in search results.
This is the default parameter value.
- none – YouTube will not filter the search result set.
- strict – YouTube will try to exclude all restricted content from the search result set.
Based on their content, search results could be removed from search results or
demoted in search results.
count:
The count will retrieve videos data.
Default is 25.
limit:
The maximum number of items each request retrieve.
For search, this should not be more than 50.
Default is 25.
page_token:
The token of the page of search result to retrieve.
You can use this retrieve point result page directly.
And you should know about the the result set for YouTube.
return_json:
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.SearchListResponse instance.
Returns:
If you want use this pass more args. You can use this.
"""
return self.search(
parts=parts,
related_to_video_id=related_to_video_id,
search_type="video",
region_code=region_code,
relevance_language=relevance_language,
safe_search=safe_search,
count=count,
limit=limit,
page_token=page_token,
return_json=return_json,
)
def get_subscription_by_id(
self,
*,
subscription_id: Union[str, list, tuple, set],
parts: Optional[Union[str, list, tuple, set]] = None,
return_json: Optional[bool] = False,
):
"""
Retrieve subscriptions by given subscription id(s).
Note:
This need authorized access token. or you will get no data.
Args:
subscription_id ((str,list,tuple,set)):
The id for subscription that you want to retrieve data.
You can pass this with single id str, comma-separated id str, or a list,tuple,set of ids.
parts ((str,list,tuple,set), optional):
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.SubscriptionListResponse instance.
Returns:
SubscriptionListResponse or original data.
"""
args = {
"id": enf_comma_separated(field="subscription_id", value=subscription_id),
"part": enf_parts(resource="subscriptions", value=parts),
}
resp = self._request(resource="subscriptions", method="GET", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return SubscriptionListResponse.from_dict(data)
def get_subscription_by_channel(
self,
*,
channel_id: str,
parts: Optional[Union[str, list, tuple, set]] = None,
for_channel_id: Optional[Union[str, list, tuple, set]] = None,
order: Optional[str] = "relevance",
count: Optional[int] = 20,
limit: Optional[int] = 20,
page_token: Optional[str] = None,
return_json: Optional[bool] = False,
):
"""
Retrieve the specified channel's subscriptions.
Note:
The API returns a 403 (Forbidden) HTTP response code if the specified channel
does not publicly expose its subscriptions and the request is not authorized
by the channel's owner.
Args:
channel_id (str):
The id for channel which you want to get subscriptions.
parts ((str,list,tuple,set) optional):
The resource parts for subscription you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
for_channel_id ((str,list,tuple,set) optional):
The parameter specifies a comma-separated list of channel IDs.
and will then only contain subscriptions matching those channels.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of channel ids.
order (str, optional):
The parameter specifies the method that will be used to sort resources in the API response.
Acceptable values are:
alphabetical – Sort alphabetically.
relevance – Sort by relevance.
unread – Sort by order of activity.
Default is relevance
count (int, optional):
The count will retrieve subscriptions data.
Default is 20.
If provide this with None, will retrieve all subscriptions.
limit (int, optional):
The maximum number of items each request retrieve.
For comment threads, this should not be more than 50.
Default is 20.
page_token(str, optional):
The token of the page of subscriptions result to retrieve.
You can use this retrieve point result page directly.
And you should know about the the result set for YouTube.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.SubscriptionListResponse instance.
Returns:
SubscriptionListResponse or original data.
"""
if count is None:
limit = 50 # for subscriptions the max limit for per request is 50
else:
limit = min(count, limit)
args = {
"channelId": channel_id,
"part": enf_parts(resource="subscriptions", value=parts),
"order": order,
"maxResults": limit,
}
if for_channel_id is not None:
args["forChannelId"] = enf_comma_separated(
field="for_channel_id", value=for_channel_id
)
if page_token is not None:
args["pageToken"] = page_token
res_data = self.paged_by_page_token(
resource="subscriptions", args=args, count=count
)
if return_json:
return res_data
else:
return SubscriptionListResponse.from_dict(res_data)
def get_subscription_by_me(
self,
*,
mine: Optional[bool] = None,
recent_subscriber: Optional[bool] = None,
subscriber: Optional[bool] = None,
parts: Optional[Union[str, list, tuple, set]] = None,
for_channel_id: Optional[Union[str, list, tuple, set]] = None,
order: Optional[str] = "relevance",
count: Optional[int] = 20,
limit: Optional[int] = 20,
page_token: Optional[str] = None,
return_json: Optional[bool] = False,
):
"""
Retrieve your subscriptions.
Note:
This can only used in a properly authorized request.
And for me test the parameter `recent_subscriber` and `subscriber` maybe not working.
Use the `mine` first.
Args:
mine (bool, optional):
Set this parameter's value to True to retrieve a feed of the authenticated user's subscriptions.
recent_subscriber (bool, optional):
Set this parameter's value to true to retrieve a feed of the subscribers of the authenticated user
in reverse chronological order (newest first).
And this can only get most recent 1000 subscribers.
subscriber (bool, optional):
Set this parameter's value to true to retrieve a feed of the subscribers of
the authenticated user in no particular order.
parts ((str,list,tuple,set) optional):
The resource parts for subscription you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
for_channel_id ((str,list,tuple,set) optional):
The parameter specifies a comma-separated list of channel IDs.
and will then only contain subscriptions matching those channels.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of channel ids.
order (str, optional):
The parameter specifies the method that will be used to sort resources in the API response.
Acceptable values are:
alphabetical – Sort alphabetically.
relevance – Sort by relevance.
unread – Sort by order of activity.
Default is relevance
count (int, optional):
The count will retrieve subscriptions data.
Default is 20.
If provide this with None, will retrieve all subscriptions.
limit (int, optional):
The maximum number of items each request retrieve.
For subscriptions, this should not be more than 50.
Default is 20.
page_token(str, optional):
The token of the page of subscriptions result to retrieve.
You can use this retrieve point result page directly.
And you should know about the the result set for YouTube.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.SubscriptionListResponse instance.
Returns:
SubscriptionListResponse or original data.
"""
if count is None:
limit = 50 # for subscriptions the max limit for per request is 50
else:
limit = min(count, limit)
args = {
"part": enf_parts(resource="subscriptions", value=parts),
"order": order,
"maxResults": limit,
}
if mine is not None:
args["mine"] = mine
elif recent_subscriber is not None:
args["myRecentSubscribers"] = recent_subscriber
elif subscriber is not None:
args["mySubscribers"] = subscriber
else:
raise PyYouTubeException(
ErrorMessage(
status_code=ErrorCode.MISSING_PARAMS,
message=f"Must specify at least one of mine,recent_subscriber,subscriber.",
)
)
if for_channel_id is not None:
args["forChannelId"] = enf_comma_separated(
field="for_channel_id", value=for_channel_id
)
if page_token is not None:
args["pageToken"] = page_token
res_data = self.paged_by_page_token(
resource="subscriptions", args=args, count=count
)
if return_json:
return res_data
else:
return SubscriptionListResponse.from_dict(res_data)
def get_video_abuse_report_reason(
self,
*,
parts: Optional[Union[str, list, tuple, set]] = None,
hl: Optional[str] = "en_US",
return_json: Optional[bool] = False,
) -> Union[VideoAbuseReportReasonListResponse, dict]:
"""
Retrieve a list of reasons that can be used to report abusive videos.
Notes:
This requires your authorization.
Args:
parts:
The resource parts for abuse reason you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
hl:
If provide this. Will return report reason's language localized info.
This value need https://developers.google.com/youtube/v3/docs/i18nLanguages.
return_json:
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.VideoAbuseReportReasonListResponse instance.
Returns:
VideoAbuseReportReasonListResponse or original data.
"""
args = {
"part": enf_parts(resource="videoAbuseReportReasons", value=parts),
"hl": hl,
}
resp = self._request(resource="videoAbuseReportReasons", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return VideoAbuseReportReasonListResponse.from_dict(data)
def get_video_categories(
self,
*,
category_id: Optional[Union[str, list, tuple, set]] = None,
region_code: Optional[str] = None,
parts: Optional[Union[str, list, tuple, set]] = None,
hl: Optional[str] = "en_US",
return_json: Optional[bool] = False,
):
"""
Retrieve video categories by category id or region code.
Args:
category_id ((str,list,tuple,set), optional):
The id for video category thread that you want to retrieve data.
You can pass this with single id str, comma-separated id str, or a list,tuple,set of ids.
region_code (str, optional):
The region code that you want to retrieve guide categories.
The parameter value is an ISO 3166-1 alpha-2 country code.
Refer: https://www.iso.org/iso-3166-country-codes.html
parts ((str,list,tuple,set) optional):
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
hl (str, optional):
If provide this. Will return video category's language localized info.
This value need https://developers.google.com/youtube/v3/docs/i18nLanguages.
Default is en_US.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.VideoCategoryListResponse instance.
Returns:
VideoCategoryListResponse or original data
"""
args = {
"part": enf_parts(resource="videoCategories", value=parts),
"hl": hl,
}
if category_id is not None:
args["id"] = enf_comma_separated(field="category_id", value=category_id)
elif region_code is not None:
args["regionCode"] = region_code
else:
raise PyYouTubeException(
ErrorMessage(
status_code=ErrorCode.MISSING_PARAMS,
message="Specify at least one of category_id or region_code",
)
)
resp = self._request(resource="videoCategories", method="GET", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return VideoCategoryListResponse.from_dict(data)
def get_video_by_id(
self,
*,
video_id: Union[str, list, tuple, set],
parts: Optional[Union[str, list, tuple, set]] = None,
hl: Optional[str] = "en_US",
max_height: Optional[int] = None,
max_width: Optional[int] = None,
return_json: Optional[bool] = False,
):
"""
Retrieve video data by given video id.
Args:
video_id ((str,list,tuple,set)):
The id for video that you want to retrieve data.
You can pass this with single id str, comma-separated id str, or a list,tuple,set of ids.
parts ((str,list,tuple,set), optional):
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
hl (str, optional):
If provide this. Will return video's language localized info.
This value need https://developers.google.com/youtube/v3/docs/i18nLanguages.
max_height (int, optional):
Specifies the maximum height of the embedded player returned in the player.embedHtml property.
Acceptable values are 72 to 8192, inclusive.
max_width (int, optional):
Specifies the maximum width of the embedded player returned in the player.embedHtml property.
Acceptable values are 72 to 8192, inclusive.
If provide max_height at the same time. This will may be shorter than max_height.
For more https://developers.google.com/youtube/v3/docs/videos/list#parameters.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.VideoListResponse instance.
Returns:
VideoListResponse or original data
"""
args = {
"id": enf_comma_separated(field="video_id", value=video_id),
"part": enf_parts(resource="videos", value=parts),
"hl": hl,
}
if max_height is not None:
args["maxHeight"] = max_height
if max_width is not None:
args["maxWidth"] = max_width
resp = self._request(resource="videos", method="GET", args=args)
data = self._parse_response(resp)
if return_json:
return data
else:
return VideoListResponse.from_dict(data)
def get_videos_by_chart(
self,
*,
chart: str,
parts: Optional[Union[str, list, tuple, set]] = None,
hl: Optional[str] = "en_US",
max_height: Optional[int] = None,
max_width: Optional[int] = None,
region_code: Optional[str] = None,
category_id: Optional[str] = "0",
count: Optional[int] = 5,
limit: Optional[int] = 5,
page_token: Optional[str] = None,
return_json: Optional[bool] = False,
):
"""
Retrieve a list of YouTube's most popular videos.
Args:
chart (str):
The chart string for you want to retrieve data.
Acceptable values are: mostPopular
parts ((str,list,tuple,set), optional):
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
hl (str, optional):
If provide this. Will return playlist's language localized info.
This value need https://developers.google.com/youtube/v3/docs/i18nLanguages.
max_height (int, optional):
Specifies the maximum height of the embedded player returned in the player.embedHtml property.
Acceptable values are 72 to 8192, inclusive.
max_width (int, optional):
Specifies the maximum width of the embedded player returned in the player.embedHtml property.
Acceptable values are 72 to 8192, inclusive.
If provide max_height at the same time. This will may be shorter than max_height.
For more https://developers.google.com/youtube/v3/docs/videos/list#parameters.
region_code (str, optional):
This parameter instructs the API to select a video chart available in the specified region.
Value is an ISO 3166-1 alpha-2 country code.
category_id (str, optional):
The id for video category that you want to filter.
Default is 0.
count (int, optional):
The count will retrieve videos data.
Default is 5.
If provide this with None, will retrieve all videos.
limit (int, optional):
The maximum number of items each request retrieve.
For videos, this should not be more than 50.
Default is 5.
page_token(str, optional):
The token of the page of videos result to retrieve.
You can use this retrieve point result page directly.
And you should know about the the result set for YouTube.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.PlaylistListResponse instance.
Returns:
VideoListResponse or original data
"""
if count is None:
limit = 50 # for videos the max limit for per request is 50
else:
limit = min(count, limit)
args = {
"chart": chart,
"part": enf_parts(resource="videos", value=parts),
"hl": hl,
"maxResults": limit,
"videoCategoryId": category_id,
}
if max_height is not None:
args["maxHeight"] = max_height
if max_width is not None:
args["maxWidth"] = max_width
if region_code:
args["regionCode"] = region_code
if page_token is not None:
args["pageToken"] = page_token
res_data = self.paged_by_page_token(resource="videos", args=args, count=count)
if return_json:
return res_data
else:
return VideoListResponse.from_dict(res_data)
def get_videos_by_myrating(
self,
*,
rating: str,
parts: Optional[Union[str, list, tuple, set]] = None,
hl: Optional[str] = "en_US",
max_height: Optional[int] = None,
max_width: Optional[int] = None,
count: Optional[int] = 5,
limit: Optional[int] = 5,
page_token: Optional[str] = None,
return_json: Optional[bool] = False,
):
"""
Retrieve video data by my ration.
Args:
rating (str):
The rating string for you to retrieve data.
Acceptable values are: dislike, like
parts ((str,list,tuple,set), optional):
The resource parts for you want to retrieve.
If not provide, use default public parts.
You can pass this with single part str, comma-separated parts str or a list,tuple,set of parts.
hl (str, optional):
If provide this. Will return video's language localized info.
This value need https://developers.google.com/youtube/v3/docs/i18nLanguages.
max_height (int, optional):
Specifies the maximum height of the embedded player returned in the player.embedHtml property.
Acceptable values are 72 to 8192, inclusive.
max_width (int, optional):
Specifies the maximum width of the embedded player returned in the player.embedHtml property.
Acceptable values are 72 to 8192, inclusive.
If provide max_height at the same time. This will may be shorter than max_height.
For more https://developers.google.com/youtube/v3/docs/videos/list#parameters.
count (int, optional):
The count will retrieve videos data.
Default is 5.
If provide this with None, will retrieve all videos.
limit (int, optional):
The maximum number of items each request retrieve.
For videos, this should not be more than 50.
Default is 5.
page_token(str, optional):
The token of the page of videos result to retrieve.
You can use this retrieve point result page directly.
And you should know about the the result set for YouTube.
return_json(bool, optional):
The return data type. If you set True JSON data will be returned.
False will return a pyyoutube.VideoListResponse instance.
Returns:
VideoListResponse or original data
"""
if self._access_token is None:
raise PyYouTubeException(
ErrorMessage(
status_code=ErrorCode.NEED_AUTHORIZATION,
message="This method can only used with authorization",
)
)
if count is None:
limit = 50 # for videos the max limit for per request is 50
else:
limit = min(count, limit)
args = {
"myRating": rating,
"part": enf_parts(resource="videos", value=parts),
"hl": hl,
"maxResults": limit,
}
if max_height is not None:
args["maxHeight"] = max_height
if max_width is not None:
args["maxWidth"] = max_width
if page_token is not None:
args["pageToken"] = page_token
res_data = self.paged_by_page_token(resource="videos", args=args, count=count)
if return_json:
return res_data
else:
return VideoListResponse.from_dict(res_data)