Spaces:
Running
Running
import pyyoutube | |
from datetime import timedelta | |
from pyyoutube import playlist | |
import re | |
import gradio as gr | |
from urllib.parse import urlparse, parse_qs | |
from contextlib import suppress | |
api_key = "AIzaSyDThR6EJnLkH56c6CpxY7HUZ_bMn4NCAKU" | |
import googleapiclient | |
from googleapiclient.discovery import build | |
from googleapiclient.errors import HttpError | |
import datetime | |
youtube = build('youtube', 'v3', developerKey=api_key) | |
def playlist_duration_func(youtubelink,videoid=False): | |
def playlist_exist_check(playlistlink): | |
def extract_playlist_id(playlistlink): | |
match = re.search(r'list=([^&]+)', playlistlink) #It searches for the string 'list=' followed by >=1 characters that are not '&'. | |
if match: | |
return match.group(1) | |
return None | |
playlist_id = extract_playlist_id(playlistlink) | |
if playlist_id is None: | |
return False | |
search_request = youtube.playlists().list( | |
part='id', | |
id=playlist_id, | |
maxResults=1 | |
) | |
search_response = search_request.execute() | |
if 'items' in search_response: | |
try: | |
playlistdict = search_response['items'][0] | |
print("ID of playlist is:- ",playlistdict['id']) | |
return playlistdict['id'] | |
except: | |
#print("Video not found.") | |
return False | |
playlistid = playlist_exist_check(youtubelink) | |
if playlistid == False or playlistid==None: | |
print("Playlist doesn't exist") | |
return False | |
print("1st check passed - Playlist link is valid") | |
#This section retrieves the video ids of all the videos in the playlist, and stores them in a list. 50 in one iteration. | |
vid_ids = [] | |
next_page_token = None | |
while True: | |
pl_request = youtube.playlistItems().list( | |
part="contentDetails,snippet", | |
playlistId=playlistid, | |
maxResults=50, #This is the max limit of videos that can be fetched in one go form a playlist as youtube data v3 API results are paginated | |
pageToken=next_page_token | |
) | |
pl_response = pl_request.execute() | |
# print("Reponse obtained from youtube") | |
for item in pl_response['items']: | |
vid_id = item['contentDetails']['videoId'] | |
vid_ids.append(vid_id) | |
if videoid==True: | |
print(item['contentDetails']['videoId']) | |
next_page_token = pl_response.get("nextPageToken") | |
if not next_page_token: | |
break | |
print("2nd check passed - Playlist read") | |
#This section obtains the playlist name from the playlist id | |
pl_request = youtube.playlists().list( | |
part="snippet", | |
id=playlistid, | |
maxResults=1 | |
) | |
pl_response = pl_request.execute() | |
playlist = pl_response['items'][0] | |
title = playlist['snippet']['title'] | |
print("Playlist Title:", title) | |
# title = playlist['snippet']['title'] | |
# print("Playlist Title:", title) | |
#This section retrieves the duration of each video in the playlist, and stores them in a list. 50 in one iteration | |
iterations = len(vid_ids)//50+1 | |
duration_list = [] | |
for i in range(iterations): | |
start_index = i * 50 | |
end_index = (i + 1) * 50 | |
batch_ids = vid_ids[start_index:end_index] | |
vid_request = youtube.videos().list( | |
part="contentDetails", | |
id=','.join(batch_ids) | |
) | |
vid_response = vid_request.execute() | |
for item in vid_response['items']: | |
duration = item['contentDetails']['duration'] | |
duration = duration[2:] | |
hours = 0 | |
minutes = 0 | |
seconds = 0 | |
if "H" in duration: | |
hours_index = duration.index("H") | |
hours = int(duration[:hours_index]) | |
duration = duration[hours_index+1:] | |
if "M" in duration: | |
minutes_index = duration.index("M") | |
minutes = int(duration[:minutes_index]) | |
duration = duration[minutes_index+1:] | |
if "S" in duration: | |
seconds_index = duration.index("S") | |
seconds = int(duration[:seconds_index]) | |
duration = timedelta(hours=hours, minutes=minutes, seconds=seconds) | |
duration_list.append(duration) | |
print("3rd check passed - Individual video duration calculated") | |
total_duration = sum(duration_list, timedelta()) | |
print("Total duration of playlist is:- ",total_duration) | |
print("Total no. of videos is = ",len(vid_ids)) | |
return str(total_duration) | |
heading = "YouTube Playlist Duration Calculator" | |
description = "Enter a YouTube playlist link and calculate its total duration." | |
inputs = gr.inputs.Textbox(label="Playlist Link") | |
outputs = gr.outputs.Textbox(label="Total Duration") | |
gr.Interface( | |
fn=playlist_duration_func, | |
inputs=inputs, | |
outputs=outputs, | |
title=heading, | |
description=description, | |
examples=[ | |
["https://www.youtube.com/playlist?list=PL-osiE80TeTsWmV9i9c58mdDCSskIFdDS"], | |
["https://www.youtube.com/playlist?list=PL-osiE80TeTtoQCKZ03TU5fNfx2UY6U4p"], | |
], | |
theme="compact", | |
).launch() |