Spaces:
Running
Running
File size: 5,314 Bytes
9ebce8e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
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() |