03 pageToken

01

This gets every video in playlist with nextPageToken in a while True: loop

from datetime import timedelta
import re
import os
from googleapiclient.discovery import build
import json
# Get new api key this one is fake
api_key = 'AIzaSyBycc_eAr1_P3NWDzR08IHkCA3_44wKEDM'
youtube = build('youtube', 'v3', developerKey=api_key)
playlist_id = 'PL-osiE80TeTsWmV9i9c58mdDCSskIFdDS'
channel_id = 'UCCezIgC97PvUuR4_gbFUs5g'

hours_pattern = re.compile(r'(\d+)H')
mins_pattern = re.compile(r'(\d+)M')
secs_pattern = re.compile(r'(\d+)S')

nextPageToken = None
while True:

    playlistItems_request = youtube.playlistItems().list(
        part='contentDetails',
        playlistId=playlist_id,
        maxResults=50,
        pageToken=nextPageToken
    )
    playlistItems_response = playlistItems_request.execute()

    vid_ids = []
    for pl_item in playlistItems_response['items']:
        vid_ids.append(pl_item['contentDetails']['videoId'])

    videos_request = youtube.videos().list(
        part="contentDetails,snippet",
        id=','.join(vid_ids),
        # maxResults = 2
    )
    os.system('clear')
    videos_response = videos_request.execute()

    for vid in videos_response['items']:
        duration = vid['contentDetails']['duration']
        hours = hours_pattern.search(duration) 
        mins = mins_pattern.search(duration)
        secs = secs_pattern.search(duration)

        hours = int(hours.group(1)) if hours else 0
        mins = int(mins.group(1)) if mins else 0
        secs = int(secs.group(1)) if secs else 0

        video_seconds = timedelta(
            hours = hours,
            minutes=mins,
            seconds=secs
        ).total_seconds()
        print(vid['snippet']['title'])
        print(video_seconds)
    
    nextPageToken = playlistItems_response.get('nextPageToken')
    if not nextPageToken:
        break

02

full code
                    from datetime import timedelta
import re
import os
from googleapiclient.discovery import build
import json
# Get new api key this one is fake
api_key = 'AIzaSyBycc_eAr1_P3NWDzR08IHkCA3_44wKEDM'
youtube = build('youtube', 'v3', developerKey=api_key)
playlist_id = 'PL-osiE80TeTsWmV9i9c58mdDCSskIFdDS'
channel_id = 'UCCezIgC97PvUuR4_gbFUs5g'
hours_pattern = re.compile(r'(\d+)H')
mins_pattern = re.compile(r'(\d+)M')
secs_pattern = re.compile(r'(\d+)S')

total_seconds = 0
nextPageToken = None
while True:
    playlistItems_request = youtube.playlistItems().list(
        part='contentDetails',
        playlistId=playlist_id,
        maxResults=50,
        pageToken=nextPageToken
    )
    playlistItems_response = playlistItems_request.execute()

    vid_ids = []
    for pl_item in playlistItems_response['items']:
        vid_ids.append(pl_item['contentDetails']['videoId'])
    videos_request = youtube.videos().list(
        part="contentDetails,snippet",
        id=','.join(vid_ids),
    )
    os.system('clear')
    videos_response = videos_request.execute()
    for vid in videos_response['items']:
        duration = vid['contentDetails']['duration']
        hours = hours_pattern.search(duration)
        mins = mins_pattern.search(duration)
        secs = secs_pattern.search(duration)

        hours = int(hours.group(1)) if hours else 0
        mins = int(mins.group(1)) if mins else 0
        secs = int(secs.group(1)) if secs else 0

        video_seconds = timedelta(
        hours = hours,
        minutes=mins,
        seconds=secs
        ).total_seconds()
        
        total_seconds += video_seconds
    nextPageToken = playlistItems_response.get('nextPageToken')
    if not nextPageToken:
        break
total_seconds = int(total_seconds)
minutes,seconds = divmod(total_seconds,60)
hours,minutes = divmod(minutes,60)
print(f'{hours}:{minutes}:{seconds}')