Pipeline registrazione/upload con storage S3, archivio web e app, proxy replay per il browser, OAuth YouTube sulla pagina club (Premium Full) e footer legale. Co-authored-by: Cursor <cursoragent@cursor.com>
58 lines
1.6 KiB
Ruby
58 lines
1.6 KiB
Ruby
module Youtube
|
|
class VideoUploadService
|
|
class Error < StandardError; end
|
|
|
|
def initialize(team, youtube_channel: nil)
|
|
@team = team
|
|
@resolver = CredentialResolver.new(team, channel: youtube_channel)
|
|
@credential = @resolver.resolve
|
|
end
|
|
|
|
def upload_file!(file_path:, title:, description: nil, privacy_status: "unlisted", tags: [])
|
|
return mock_upload if @credential.blank? || missing_oauth_config?
|
|
raise Error, "File non trovato" unless File.exist?(file_path)
|
|
|
|
client = authorized_client
|
|
video = Google::Apis::YoutubeV3::Video.new(
|
|
snippet: Google::Apis::YoutubeV3::VideoSnippet.new(
|
|
title: title,
|
|
description: description,
|
|
tags: tags.presence
|
|
),
|
|
status: Google::Apis::YoutubeV3::VideoStatus.new(
|
|
privacy_status: privacy_status,
|
|
self_declared_made_for_kids: false
|
|
)
|
|
)
|
|
|
|
result = client.insert_video(
|
|
"snippet,status",
|
|
video,
|
|
upload_source: file_path,
|
|
content_type: "video/mp4"
|
|
)
|
|
{
|
|
video_id: result.id,
|
|
watch_url: "https://www.youtube.com/watch?v=#{result.id}"
|
|
}
|
|
rescue Google::Apis::Error => e
|
|
raise Error, e.message
|
|
end
|
|
|
|
private
|
|
|
|
def mock_upload
|
|
id = "mock_vod_#{SecureRandom.hex(6)}"
|
|
{ video_id: id, watch_url: "https://www.youtube.com/watch?v=#{id}" }
|
|
end
|
|
|
|
def missing_oauth_config?
|
|
ENV["YOUTUBE_CLIENT_ID"].blank?
|
|
end
|
|
|
|
def authorized_client
|
|
OauthRefresh.new(@credential).apply!(Google::Apis::YoutubeV3::YouTubeService.new)
|
|
end
|
|
end
|
|
end
|