————————————————————————— ValueError Traceback (most recent call last) Cell In[42], line 57 55 max_results = 10 # 取得する動画の最大数 56 max_duration = 60 # 再生時間の最大値(秒) —> 57 filtered_videos = search_videos_by_keyword_and_duration(keyword, max_results=max_results, max_duration=max_duration) 58 print(“再生時間が1分以内の動画:”) 59 for url in filtered_videos: Cell In[42], line 31, in search_videos_by_keyword_and_duration(keyword, max_results, max_duration) 26 video_info = youtube.videos().list( 27 part=’contentDetails’, # 再生時間を取得するためにcontentDetailsを指定 28 id=video_id 29 ).execute() 30 duration = video_info[‘items’][0][‘contentDetails’][‘duration’] —> 31 duration_seconds = parse_duration(duration) 32 # 再生時間が指定した時間以内の動画をフィルタリング 33 if duration_seconds <= max_duration: Cell In[42], line 43, in parse_duration(duration) 39 def parse_duration(duration): 40 # ISO 8601形式の再生時間(例: “PT3M51S”)を秒数に変換 41 # PTを削除して、MとSの間にある文字列を取得して分と秒に分割 42 duration = duration.replace(‘PT’, ”) —> 43 minutes, seconds = duration.split(‘M’) 44 # 秒数がない場合は0秒として扱う 45 if ‘S’ in seconds: ValueError: not enough values to unpack (expected 2, got 1)
エラーの原因は、動画の再生時間を取得しようとした際に、想定していた形式ではないデータが返されたことです。再生時間はISO 8601形式で表されるため、予期しない形式のデータが含まれている可能性があります。
解決策としては、動画の再生時間を正しく解析する方法を変更することです。以下は、再生時間の解析方法を修正したサンプルコードです。
python
def parse_duration(duration): # ISO 8601形式の再生時間(例: "PT3M51S")を秒数に変換 # PTを削除して、Tの後ろにある文字列を取得して時間、分、秒に分割 duration = duration.replace('PT', '') # 時間が含まれている場合と含まれていない場合で処理を分ける if 'H' in duration: hours, duration = duration.split('H') hours = int(hours) else: hours = 0 # 分と秒に分割 if 'M' in duration: minutes, duration = duration.split('M') minutes = int(minutes) else: minutes = 0 # 秒数がない場合は0秒として扱う if 'S' in duration: seconds = duration.replace('S', '') seconds = int(seconds) else: seconds = 0 # 時間、分、秒を秒数に変換して合算 total_seconds = hours * 3600 + minutes * 60 + seconds return total_seconds
このコードでは、再生時間をISO 8601形式から適切に解析するために、再生時間の形式に応じて処理を分岐させています。再度お試しください。

ディスカッション
コメント一覧
まだ、コメントがありません