|
|
import re |
|
|
|
|
|
def format_timestamp(seconds): |
|
|
"""Formats time in seconds to hours:minutes:seconds format.""" |
|
|
hours = int(seconds // 3600) |
|
|
minutes = int((seconds % 3600) // 60) |
|
|
secs = int(seconds % 60) |
|
|
|
|
|
if hours > 0: |
|
|
return f"{hours:02d}:{minutes:02d}:{secs:02d}" |
|
|
else: |
|
|
return f"{minutes:02d}:{secs:02d}" |
|
|
|
|
|
def extract_video_id(video_id_or_url): |
|
|
""" |
|
|
Extracts video ID from a string that can be either an ID or full YouTube URL. |
|
|
|
|
|
Supported formats: |
|
|
- Simple ID (e.g., dQw4w9WgXcQ) |
|
|
- https://www.youtube.com/watch?v=dQw4w9WgXcQ |
|
|
- https://youtu.be/dQw4w9WgXcQ |
|
|
- https://youtube.com/shorts/dQw4w9WgXcQ |
|
|
- https://www.youtube.com/embed/dQw4w9WgXcQ |
|
|
- https://youtube.com/live/dQw4w9WgXcQ |
|
|
|
|
|
Returns: |
|
|
- Video ID or original string if ID not found |
|
|
""" |
|
|
print(f"Processing input value: {video_id_or_url}") |
|
|
|
|
|
|
|
|
if not video_id_or_url: |
|
|
print("Empty video ID") |
|
|
return "" |
|
|
|
|
|
|
|
|
if re.match(r'^[a-zA-Z0-9_-]{11}$', video_id_or_url): |
|
|
print(f"Found simple ID: {video_id_or_url}") |
|
|
return video_id_or_url |
|
|
|
|
|
|
|
|
inner_url_match = re.search(r'https?://(?:www\.)?(?:youtube\.com|youtu\.be).*?(?=&|$|\s)', video_id_or_url) |
|
|
if inner_url_match: |
|
|
inner_url = inner_url_match.group(0) |
|
|
print(f"Found nested URL: {inner_url}") |
|
|
video_id_or_url = inner_url |
|
|
|
|
|
|
|
|
match = re.search(r'(?:youtube\.com/watch\?v=|youtu\.be/|youtube\.com/shorts/|youtube\.com/embed/|youtube\.com/live/)([a-zA-Z0-9_-]{11})', video_id_or_url) |
|
|
if match: |
|
|
video_id = match.group(1) |
|
|
print(f"Extracted ID from URL: {video_id}") |
|
|
return video_id |
|
|
|
|
|
|
|
|
print(f"Failed to extract ID, returning original value: {video_id_or_url}") |
|
|
return video_id_or_url |