DebasishDhal99's picture
playlist_duration.py
9ebce8e
raw
history blame
5.31 kB
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()