@ -229,18 +229,18 @@ def fetch_channel(ucid, db, pull_all_videos = true, locale = nil)
page = 1
page = 1
LOGGER . trace ( " fetch_channel: #{ ucid } : Downloading channel videos page " )
LOGGER . trace ( " fetch_channel: #{ ucid } : Downloading channel videos page " )
response = get_channel_videos_response ( ucid , page , auto_generated : auto_generated )
response _body = get_channel_videos_response ( ucid , page , auto_generated : auto_generated )
videos = [ ] of SearchVideo
videos = [ ] of SearchVideo
begin
begin
initial_data = JSON . parse ( response . body)
initial_data = JSON . parse ( response _ body)
raise InfoException . new ( " Could not extract channel JSON " ) if ! initial_data
raise InfoException . new ( " Could not extract channel JSON " ) if ! initial_data
LOGGER . trace ( " fetch_channel: #{ ucid } : Extracting videos from channel videos page initial_data " )
LOGGER . trace ( " fetch_channel: #{ ucid } : Extracting videos from channel videos page initial_data " )
videos = extract_videos ( initial_data . as_h , author , ucid )
videos = extract_videos ( initial_data . as_h , author , ucid )
rescue ex
rescue ex
if response . body. includes? ( " To continue with your YouTube experience, please fill out the form below. " ) ||
if response _ body. includes? ( " To continue with your YouTube experience, please fill out the form below. " ) ||
response . body. includes? ( " https://www.google.com/sorry/index " )
response _ body. includes? ( " https://www.google.com/sorry/index " )
raise InfoException . new ( " Could not extract channel info. Instance is likely blocked. " )
raise InfoException . new ( " Could not extract channel info. Instance is likely blocked. " )
end
end
raise ex
raise ex
@ -304,8 +304,8 @@ def fetch_channel(ucid, db, pull_all_videos = true, locale = nil)
ids = [ ] of String
ids = [ ] of String
loop do
loop do
response = get_channel_videos_response ( ucid , page , auto_generated : auto_generated )
response _body = get_channel_videos_response ( ucid , page , auto_generated : auto_generated )
initial_data = JSON . parse ( response . body)
initial_data = JSON . parse ( response _ body)
raise InfoException . new ( " Could not extract channel JSON " ) if ! initial_data
raise InfoException . new ( " Could not extract channel JSON " ) if ! initial_data
videos = extract_videos ( initial_data . as_h , author , ucid )
videos = extract_videos ( initial_data . as_h , author , ucid )
@ -447,6 +447,7 @@ def produce_channel_videos_continuation(ucid, page = 1, auto_generated = nil, so
return continuation
return continuation
end
end
# Used in bypass_captcha_job.cr
def produce_channel_videos_url ( ucid , page = 1 , auto_generated = nil , sort_by = " newest " , v2 = false )
def produce_channel_videos_url ( ucid , page = 1 , auto_generated = nil , sort_by = " newest " , v2 = false )
continuation = produce_channel_videos_continuation ( ucid , page , auto_generated , sort_by , v2 )
continuation = produce_channel_videos_continuation ( ucid , page , auto_generated , sort_by , v2 )
return " /browse_ajax?continuation= #{ continuation } &gl=US&hl=en "
return " /browse_ajax?continuation= #{ continuation } &gl=US&hl=en "
@ -937,35 +938,19 @@ def get_about_info(ucid, locale)
} )
} )
end
end
def get_channel_videos_response ( ucid , page = 1 , auto_generated = nil , sort_by = " newest " , youtubei_browse = true )
def get_channel_videos_response ( ucid , page = 1 , auto_generated = nil , sort_by = " newest " )
if youtubei_browse
continuation = produce_channel_videos_continuation ( ucid , page ,
continuation = produce_channel_videos_continuation ( ucid , page , auto_generated : auto_generated , sort_by : sort_by , v2 : true )
auto_generated : auto_generated , sort_by : sort_by , v2 : true )
data = {
" context " : {
return request_youtube_api_browse ( continuation )
" client " : {
" clientName " : " WEB " ,
" clientVersion " : " 2.20201021.03.00 " ,
} ,
} ,
" continuation " : continuation ,
} . to_json
return YT_POOL . client & . post (
" /youtubei/v1/browse?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8 " ,
headers : HTTP :: Headers { " content-type " = > " application/json " } ,
body : data
)
else
url = produce_channel_videos_url ( ucid , page , auto_generated : auto_generated , sort_by : sort_by , v2 : true )
return YT_POOL . client & . get ( url )
end
end
end
def get_60_videos ( ucid , author , page , auto_generated , sort_by = " newest " )
def get_60_videos ( ucid , author , page , auto_generated , sort_by = " newest " )
videos = [ ] of SearchVideo
videos = [ ] of SearchVideo
2 . times do | i |
2 . times do | i |
response = get_channel_videos_response ( ucid , page * 2 + ( i - 1 ) , auto_generated : auto_generated , sort_by : sort_by )
response_json = get_channel_videos_response ( ucid , page * 2 + ( i - 1 ) , auto_generated : auto_generated , sort_by : sort_by )
initial_data = JSON . parse ( response . body )
initial_data = JSON . parse ( response_json )
break if ! initial_data
break if ! initial_data
videos . concat extract_videos ( initial_data . as_h , author , ucid )
videos . concat extract_videos ( initial_data . as_h , author , ucid )
end
end
@ -974,8 +959,8 @@ def get_60_videos(ucid, author, page, auto_generated, sort_by = "newest")
end
end
def get_latest_videos ( ucid )
def get_latest_videos ( ucid )
response = get_channel_videos_response ( ucid )
response _json = get_channel_videos_response ( ucid )
initial_data = JSON . parse ( response . body )
initial_data = JSON . parse ( response _json )
return [ ] of SearchVideo if ! initial_data
return [ ] of SearchVideo if ! initial_data
author = initial_data [ " metadata " ]? . try & . [ " channelMetadataRenderer " ]? . try & . [ " title " ]? . try & . as_s
author = initial_data [ " metadata " ]? . try & . [ " channelMetadataRenderer " ]? . try & . [ " title " ]? . try & . as_s
items = extract_videos ( initial_data . as_h , author , ucid )
items = extract_videos ( initial_data . as_h , author , ucid )