Spaces:
Running
Running
import yt_dlp | |
import logging | |
# Configure logging for debugging purposes | |
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') | |
# Function to search YouTube videos using yt-dlp for better reliability | |
def youtube_search(query, max_results=50): | |
ydl_opts = { | |
'quiet': False, # Set to False to get more detailed output from yt-dlp | |
'extract_flat': 'in_playlist', | |
'logger': logging.getLogger(), # Use the logging module to capture yt-dlp logs | |
'simulate': True, | |
'noplaylist': True, # To avoid playlist entries | |
} | |
search_url = f"ytsearch{max_results}:{query}" | |
logging.debug(f"Starting YouTube search for query: {query}") | |
try: | |
with yt_dlp.YoutubeDL(ydl_opts) as ydl: | |
result = ydl.extract_info(search_url, download=False) | |
detailed_entries = [] | |
if 'entries' in result: | |
logging.debug(f"Number of entries found: {len(result['entries'])}") | |
for entry in result['entries']: | |
# Collect and print each field separately | |
print("\n==============================") | |
print("Video Details:") | |
print("==============================") | |
print(f"ID: {entry.get('id', 'N/A')}") | |
print(f"Title: {entry.get('title', 'N/A')}") | |
print(f"Uploader: {entry.get('uploader', 'N/A')}") | |
print(f"Uploader ID: {entry.get('uploader_id', 'N/A')}") | |
print(f"Upload Date: {entry.get('upload_date', 'N/A')}") | |
print(f"Description: {entry.get('description', 'N/A')}") | |
print(f"Duration (seconds): {entry.get('duration', 'N/A')}") | |
print(f"View Count: {entry.get('view_count', 'N/A')}") | |
print(f"Like Count: {entry.get('like_count', 'N/A')}") | |
print(f"Dislike Count: {entry.get('dislike_count', 'N/A')}") | |
print(f"Comment Count: {entry.get('comment_count', 'N/A')}") | |
print(f"Average Rating: {entry.get('average_rating', 'N/A')}") | |
print(f"Thumbnail URL: {entry.get('thumbnail', 'N/A')}") | |
print(f"Webpage URL: {entry.get('webpage_url', 'N/A')}") | |
print(f"Channel URL: {entry.get('channel_url', 'N/A')}") | |
print(f"Categories: {entry.get('categories', 'N/A')}") | |
print(f"Tags: {entry.get('tags', 'N/A')}") | |
print(f"Channel ID: {entry.get('channel_id', 'N/A')}") | |
print(f"Age Restriction: {entry.get('age_limit', 'N/A')}") | |
print(f"Is Live: {entry.get('is_live', 'N/A')}") | |
print(f"FPS: {entry.get('fps', 'N/A')}") | |
print(f"Resolution: {entry.get('resolution', 'N/A')}") | |
print(f"Aspect Ratio: {entry.get('aspect_ratio', 'N/A')}") | |
print(f"Video Codec: {entry.get('vcodec', 'N/A')}") | |
print(f"Audio Codec: {entry.get('acodec', 'N/A')}") | |
print("==============================\n") | |
# Add the entry details to the list if needed | |
detailed_entries.append(entry) | |
else: | |
logging.warning("No entries found in search result.") | |
return detailed_entries | |
except Exception as e: | |
error_message = f"Error during YouTube yt-dlp request: {e}" | |
logging.error(error_message) | |
return [] | |
# Test the function with a sample query | |
youtube_search("test video") | |