@@ -6,25 +6,31 @@ This plugin provides a command to fetch YouTube video information from links.
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				import  re 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				import  logging 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				from  pytube  import  YouTube 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				from  pytubefix   import  YouTube 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				import  simplematrixbotlib  as  botlib 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				import  asyncio 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				def  seconds_to_minutes_seconds ( seconds ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    minutes  =  seconds  / /  60 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    seconds  % =  60 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    return  f " { minutes : 02d } : { seconds : 02d } " 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				async  def  fetch_youtube_info ( youtube_url ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    try : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        video  =  YouTube ( youtube_url ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        title  =  video . title 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        description  =  video . description 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        length  =  seconds_to_minutes_seconds ( video . length ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        views  =  video . views 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        author  =  video . author 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        description_with_breaks  =  description . replace ( ' \n ' ,  ' <br> ' ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        info_message  =  f """ <strong>🎬🎝 Title:</strong>  { title }  | <strong>Length</strong>:  { length }  minutes | <strong>Views</strong>:  { views } \n <details><summary><strong>⤵︎  Click Here For Description⤵︎  </strong></summary> { description_with_breaks } </details> """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        return  info_message 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    except  Exception  as  e : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        logging . error ( f " Error fetching YouTube video information:  { str ( e ) } " ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        return  None 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				async  def  handle_command ( room ,  message ,  bot ,  prefix ,  config ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    Function to handle YouTube video information from links. 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    Args: 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        room (Room): The Matrix room where the command was invoked. 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        message (RoomMessage): The message object containing the command. 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    Returns: 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        None 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				     """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    match  =  botlib . MessageMatch ( room ,  message ,  bot ,  prefix ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				    if  match . is_not_from_this_bot ( )  and  re . search ( r ' youtube \ .com/watch \ ?v= ' ,  message . body ) : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				        logging . info ( " YouTube link detected " ) 
 
			
		 
		
	
	
		
			
				
					
					
						
					 
				
			
			 
			 
			
				@@ -33,16 +39,18 @@ async def handle_command(room, message, bot, prefix, config):
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            video_id  =  video_id_match . group ( 1 ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            youtube_url  =  f " https://www.youtube.com/watch?v= { video_id } " 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            logging . info ( f " Fetching information for YouTube video:  { youtube_url } " ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            try : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                video  =  YouTube ( youtube_url  ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                title  =  video . title 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                description  =  video . description 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                length  =  seconds_to_minutes_seconds ( video . length ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                views  =  video . views 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                author  =  video . author 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                info_message  =  f """ **🎬🎝 Title:**  { title }  | **Length**:  { length }  minutes| **Views:**  { views }  | **Description:**  { description } """ 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                await  bot . api . send_markdown_message ( room . room_id ,  info_message ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                logging . info ( " Sent YouTube video information to the room " ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            except  Exception  as  e : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                logging . error ( f " Error fetching YouTube video information:  { str ( e ) } " )  
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                # await bot.api.send__message(room.room_id, "Error  fetching  YouTube video information." )
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            retry_count  =  3 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            while  retry_count  >  0 : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                info_message  =  await  fetch_youtube_info ( youtube_url ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                if  info_message : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                    await  bot . api . send_markdown_message ( room . room_id ,  info_message  ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                    logging . info ( " Sent YouTube video information to the room " )  
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                    break  
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                else : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                    logging . info ( " Retrying... "  ) 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                    retry_count  - =  1  
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                    await  asyncio . sleep ( 1 )   # wait for 1 second before retrying  
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				            else : 
 
			
		 
		
	
		
			
				 
				 
			
			 
			 
			
				                logging . error ( " Failed to  fetch YouTube video information after retries "  )