@@ -77,6 +77,7 @@ def __init__(
7777 ],
7878 ] = {
7979 "get" : self ._api_get_request ,
80+ "head" : self ._api_head_request ,
8081 }
8182
8283 async def _check_request_return (self , response : ClientResponse ) -> ClientResponse :
@@ -115,6 +116,18 @@ async def _api_get_request(
115116 response = await session .get (url , headers = headers , json = data )
116117 return await self ._check_request_return (response )
117118
119+ async def _api_head_request (
120+ self ,
121+ session : ClientSession ,
122+ url : str ,
123+ data : dict [str , Any ] | None = None ,
124+ ) -> ClientResponse :
125+ """Make HEAD request with authorization."""
126+ headers = {"Authorization" : f"Bearer { self ._user_auth_token } " }
127+ self .logger .debug ("making HEAD request to %s" , url )
128+ response = await session .head (url , headers = headers , json = data )
129+ return await self ._check_request_return (response )
130+
118131 async def _build_generator (
119132 self ,
120133 req : str ,
@@ -284,6 +297,20 @@ async def get_playlist_items(
284297 ):
285298 yield item # type: ignore[misc]
286299
300+ async def is_short (self , video_id : str ) -> bool :
301+ """Return True if the video ID corresponds to a YouTube Short."""
302+ _url = "https://www.youtube.com/shorts/" + video_id
303+ if not self .session :
304+ self .session = ClientSession ()
305+ self ._close_session = True
306+ async with asyncio .timeout (self .session_timeout ):
307+ response = await self ._api_head_request (self .session , _url )
308+ if response .status == 200 :
309+ return True
310+ if response .status == 303 :
311+ return False
312+ raise YouTubeAPIError
313+
287314 async def close (self ) -> None :
288315 """Close open client session."""
289316 if self .session and self ._close_session :
0 commit comments