diff --git a/backend/app/services/youtube/api_client.rb b/backend/app/services/youtube/api_client.rb index 0f81eb8..e572b6f 100644 --- a/backend/app/services/youtube/api_client.rb +++ b/backend/app/services/youtube/api_client.rb @@ -11,14 +11,17 @@ module Youtube @api_key = api_key end - def search_videos q:, published_after:, page_token: nil + def search_videos q:, published_after: nil, published_before: nil, page_token: nil get_json('/search', { part: 'snippet', type: 'video', - q: q, + q:, order: 'date', maxResults: 50, - publishedAfter: published_after.iso8601, + regionCode: 'JP', + relevanceLanguage: 'ja', + publishedAfter: published_after&.iso8601, + publishedBefore: published_before&.iso8601, pageToken: page_token }.compact) end @@ -37,6 +40,8 @@ module Youtube end def channel id: nil, handle: nil + raise ArgumentError, 'id or handle is required' if id.present? == handle.present? + params = { part: 'snippet,contentDetails' } params[:id] = id if id params[:forHandle] = handle if handle diff --git a/backend/app/services/youtube/sync.rb b/backend/app/services/youtube/sync.rb index da8dc88..2056dc2 100644 --- a/backend/app/services/youtube/sync.rb +++ b/backend/app/services/youtube/sync.rb @@ -35,9 +35,10 @@ module Youtube end playlist_ids.each do |playlist_id| - response = @client.playlist_items(playlist_id:) - response.fetch('items', []).each do |item| + each_playlist_item(playlist_id) do |item| video_id = item.dig('contentDetails', 'videoId') + video_id ||= item.dig('snippet', 'resourceId', 'videoId') + ids << video_id if video_id.present? end end @@ -70,7 +71,7 @@ module Youtube title: video.title, url: video.url, thumbnail_base: video.thumbnail_url, - uploaded_user: nil, + uploaded_user_id: nil, original_created_from:, original_created_before:) @@ -84,6 +85,7 @@ module Youtube deerjikist = Deerjikist.find_by(platform: :youtube, code: video.channel_id) if deerjikist + desired_tag_ids.delete(Tag.no_deerjikist.id) desired_tag_ids << deerjikist.tag_id elsif post.tags.where(category: :deerjikist).none? desired_tag_ids << Tag.no_deerjikist.id @@ -147,5 +149,20 @@ module Youtube end def sync_since = 14.days.ago + + def each_playlist_item playlist_id + page_token = nil + + loop do + response = @client.playlist_items(playlist_id:, page_token:) + + response.fetch('items', []).each do |item| + yield item + end + + page_token = response['nextPageToken'] + break if page_token.blank? + end + end end end diff --git a/backend/app/services/youtube/video_item.rb b/backend/app/services/youtube/video_item.rb index b8bad47..fea2b15 100644 --- a/backend/app/services/youtube/video_item.rb +++ b/backend/app/services/youtube/video_item.rb @@ -1,3 +1,6 @@ +require 'time' + + module Youtube class VideoItem attr_reader :id, :title, :channel_id, :published_at, :thumbnail_url, :raw_tags