|
|
|
@ -25,23 +25,41 @@ class PlaylistVideo
|
|
|
|
|
})
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def extract_playlist(plid, page)
|
|
|
|
|
def fetch_playlist_videos(plid, page, video_count)
|
|
|
|
|
client = make_client(YT_URL)
|
|
|
|
|
|
|
|
|
|
if video_count > 100
|
|
|
|
|
index = (page - 1) * 100
|
|
|
|
|
url = produce_playlist_url(plid, index)
|
|
|
|
|
|
|
|
|
|
client = make_client(YT_URL)
|
|
|
|
|
response = client.get(url)
|
|
|
|
|
response = JSON.parse(response.body)
|
|
|
|
|
if !response["content_html"]? || response["content_html"].as_s.empty?
|
|
|
|
|
raise "Playlist does not exist"
|
|
|
|
|
raise "Playlist is empty"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
document = XML.parse_html(response["content_html"].as_s)
|
|
|
|
|
nodeset = document.xpath_nodes(%q(.//tr[contains(@class, "pl-video")]))
|
|
|
|
|
videos = extract_playlist(plid, nodeset, index)
|
|
|
|
|
else
|
|
|
|
|
if page > 1
|
|
|
|
|
videos = [] of PlaylistVideo
|
|
|
|
|
else
|
|
|
|
|
response = client.get("/playlist?list=#{plid}&disable_polymer=1")
|
|
|
|
|
document = XML.parse_html(response.body)
|
|
|
|
|
nodeset = document.xpath_nodes(%q(.//tr[contains(@class, "pl-video")]))
|
|
|
|
|
|
|
|
|
|
document = XML.parse_html(response["content_html"].as_s)
|
|
|
|
|
anchor = document.xpath_node(%q(//div[@class="pl-video-owner"]/a))
|
|
|
|
|
if anchor
|
|
|
|
|
document.xpath_nodes(%q(.//tr[contains(@class, "pl-video")])).each_with_index do |video, offset|
|
|
|
|
|
videos = extract_playlist(plid, nodeset, 0)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return videos
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def extract_playlist(plid, nodeset, index)
|
|
|
|
|
videos = [] of PlaylistVideo
|
|
|
|
|
|
|
|
|
|
nodeset.each_with_index do |video, offset|
|
|
|
|
|
anchor = video.xpath_node(%q(.//td[@class="pl-video-title"]))
|
|
|
|
|
if !anchor
|
|
|
|
|
next
|
|
|
|
@ -77,7 +95,6 @@ def extract_playlist(plid, page)
|
|
|
|
|
index + offset,
|
|
|
|
|
)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return videos
|
|
|
|
|
end
|
|
|
|
@ -112,13 +129,18 @@ def produce_playlist_url(id, index)
|
|
|
|
|
continuation = Base64.urlsafe_encode(continuation)
|
|
|
|
|
continuation = URI.escape(continuation)
|
|
|
|
|
|
|
|
|
|
url = "/browse_ajax?action_continuation=1&continuation=#{continuation}"
|
|
|
|
|
url = "/browse_ajax?continuation=#{continuation}"
|
|
|
|
|
|
|
|
|
|
return url
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def fetch_playlist(plid)
|
|
|
|
|
client = make_client(YT_URL)
|
|
|
|
|
|
|
|
|
|
if plid.starts_with? "UC"
|
|
|
|
|
plid = "UU#{plid.lchop("UC")}"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
response = client.get("/playlist?list=#{plid}&disable_polymer=1")
|
|
|
|
|
body = response.body.gsub(<<-END_BUTTON
|
|
|
|
|
<button class="yt-uix-button yt-uix-button-size-default yt-uix-button-link yt-uix-expander-head playlist-description-expander yt-uix-inlineedit-ignore-edit" type="button" onclick=";return false;"><span class="yt-uix-button-content"> less <img alt="" src="/yts/img/pixel-vfl3z5WfW.gif">
|
|
|
|
|