webscarper / app.py
mobenta's picture
Update app.py
09d03cf verified
raw
history blame
3.64 kB
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")