|
|
@ -338,8 +338,8 @@ get "/watch" do |env|
|
|
|
|
|
|
|
|
|
|
|
|
preferences = env.get("preferences").as(Preferences)
|
|
|
|
preferences = env.get("preferences").as(Preferences)
|
|
|
|
|
|
|
|
|
|
|
|
if env.get? "user"
|
|
|
|
user = env.get?("user").try &.as(User)
|
|
|
|
user = env.get("user").as(User)
|
|
|
|
if user
|
|
|
|
subscriptions = user.subscriptions
|
|
|
|
subscriptions = user.subscriptions
|
|
|
|
watched = user.watched
|
|
|
|
watched = user.watched
|
|
|
|
end
|
|
|
|
end
|
|
|
@ -347,9 +347,10 @@ get "/watch" do |env|
|
|
|
|
|
|
|
|
|
|
|
|
params = process_video_params(env.params.query, preferences)
|
|
|
|
params = process_video_params(env.params.query, preferences)
|
|
|
|
env.params.query.delete_all("listen")
|
|
|
|
env.params.query.delete_all("listen")
|
|
|
|
|
|
|
|
env.params.query.delete_all("iv_load_policy")
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
begin
|
|
|
|
video = get_video(id, PG_DB, proxies, region: params[:region])
|
|
|
|
video = get_video(id, PG_DB, proxies, region: params.region)
|
|
|
|
rescue ex : VideoRedirect
|
|
|
|
rescue ex : VideoRedirect
|
|
|
|
next env.redirect "/watch?v=#{ex.message}"
|
|
|
|
next env.redirect "/watch?v=#{ex.message}"
|
|
|
|
rescue ex
|
|
|
|
rescue ex
|
|
|
@ -358,6 +359,10 @@ get "/watch" do |env|
|
|
|
|
next templated "error"
|
|
|
|
next templated "error"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if preferences.annotations_subscribed && subscriptions.includes? video.ucid
|
|
|
|
|
|
|
|
params.annotations = true
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
if watched && !watched.includes? id
|
|
|
|
if watched && !watched.includes? id
|
|
|
|
PG_DB.exec("UPDATE users SET watched = watched || $1 WHERE email = $2", [id], user.as(User).email)
|
|
|
|
PG_DB.exec("UPDATE users SET watched = watched || $1 WHERE email = $2", [id], user.as(User).email)
|
|
|
|
end
|
|
|
|
end
|
|
|
@ -404,7 +409,7 @@ get "/watch" do |env|
|
|
|
|
fmt_stream = video.fmt_stream(decrypt_function)
|
|
|
|
fmt_stream = video.fmt_stream(decrypt_function)
|
|
|
|
adaptive_fmts = video.adaptive_fmts(decrypt_function)
|
|
|
|
adaptive_fmts = video.adaptive_fmts(decrypt_function)
|
|
|
|
|
|
|
|
|
|
|
|
if params[:local]
|
|
|
|
if params.local
|
|
|
|
fmt_stream.each { |fmt| fmt["url"] = URI.parse(fmt["url"]).full_path }
|
|
|
|
fmt_stream.each { |fmt| fmt["url"] = URI.parse(fmt["url"]).full_path }
|
|
|
|
adaptive_fmts.each { |fmt| fmt["url"] = URI.parse(fmt["url"]).full_path }
|
|
|
|
adaptive_fmts.each { |fmt| fmt["url"] = URI.parse(fmt["url"]).full_path }
|
|
|
|
end
|
|
|
|
end
|
|
|
@ -415,12 +420,12 @@ get "/watch" do |env|
|
|
|
|
captions = video.captions
|
|
|
|
captions = video.captions
|
|
|
|
|
|
|
|
|
|
|
|
preferred_captions = captions.select { |caption|
|
|
|
|
preferred_captions = captions.select { |caption|
|
|
|
|
params[:preferred_captions].includes?(caption.name.simpleText) ||
|
|
|
|
params.preferred_captions.includes?(caption.name.simpleText) ||
|
|
|
|
params[:preferred_captions].includes?(caption.languageCode.split("-")[0])
|
|
|
|
params.preferred_captions.includes?(caption.languageCode.split("-")[0])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
preferred_captions.sort_by! { |caption|
|
|
|
|
preferred_captions.sort_by! { |caption|
|
|
|
|
(params[:preferred_captions].index(caption.name.simpleText) ||
|
|
|
|
(params.preferred_captions.index(caption.name.simpleText) ||
|
|
|
|
params[:preferred_captions].index(caption.languageCode.split("-")[0])).not_nil!
|
|
|
|
params.preferred_captions.index(caption.languageCode.split("-")[0])).not_nil!
|
|
|
|
}
|
|
|
|
}
|
|
|
|
captions = captions - preferred_captions
|
|
|
|
captions = captions - preferred_captions
|
|
|
|
|
|
|
|
|
|
|
@ -441,11 +446,11 @@ get "/watch" do |env|
|
|
|
|
|
|
|
|
|
|
|
|
thumbnail = "/vi/#{video.id}/maxres.jpg"
|
|
|
|
thumbnail = "/vi/#{video.id}/maxres.jpg"
|
|
|
|
|
|
|
|
|
|
|
|
if params[:raw]
|
|
|
|
if params.raw
|
|
|
|
url = fmt_stream[0]["url"]
|
|
|
|
url = fmt_stream[0]["url"]
|
|
|
|
|
|
|
|
|
|
|
|
fmt_stream.each do |fmt|
|
|
|
|
fmt_stream.each do |fmt|
|
|
|
|
if fmt["label"].split(" - ")[0] == params[:quality]
|
|
|
|
if fmt["label"].split(" - ")[0] == params.quality
|
|
|
|
url = fmt["url"]
|
|
|
|
url = fmt["url"]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
@ -533,8 +538,15 @@ get "/embed/:id" do |env|
|
|
|
|
|
|
|
|
|
|
|
|
params = process_video_params(env.params.query, preferences)
|
|
|
|
params = process_video_params(env.params.query, preferences)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
user = env.get?("user").try &.as(User)
|
|
|
|
|
|
|
|
if user
|
|
|
|
|
|
|
|
subscriptions = user.subscriptions
|
|
|
|
|
|
|
|
watched = user.watched
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
subscriptions ||= [] of String
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
begin
|
|
|
|
video = get_video(id, PG_DB, proxies, region: params[:region])
|
|
|
|
video = get_video(id, PG_DB, proxies, region: params.region)
|
|
|
|
rescue ex : VideoRedirect
|
|
|
|
rescue ex : VideoRedirect
|
|
|
|
next env.redirect "/embed/#{ex.message}"
|
|
|
|
next env.redirect "/embed/#{ex.message}"
|
|
|
|
rescue ex
|
|
|
|
rescue ex
|
|
|
@ -542,10 +554,18 @@ get "/embed/:id" do |env|
|
|
|
|
next templated "error"
|
|
|
|
next templated "error"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if preferences.annotations_subscribed && subscriptions.includes? video.ucid
|
|
|
|
|
|
|
|
params.annotations = true
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if watched && !watched.includes? id
|
|
|
|
|
|
|
|
PG_DB.exec("UPDATE users SET watched = watched || $1 WHERE email = $2", [id], user.as(User).email)
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
fmt_stream = video.fmt_stream(decrypt_function)
|
|
|
|
fmt_stream = video.fmt_stream(decrypt_function)
|
|
|
|
adaptive_fmts = video.adaptive_fmts(decrypt_function)
|
|
|
|
adaptive_fmts = video.adaptive_fmts(decrypt_function)
|
|
|
|
|
|
|
|
|
|
|
|
if params[:local]
|
|
|
|
if params.local
|
|
|
|
fmt_stream.each { |fmt| fmt["url"] = URI.parse(fmt["url"]).full_path }
|
|
|
|
fmt_stream.each { |fmt| fmt["url"] = URI.parse(fmt["url"]).full_path }
|
|
|
|
adaptive_fmts.each { |fmt| fmt["url"] = URI.parse(fmt["url"]).full_path }
|
|
|
|
adaptive_fmts.each { |fmt| fmt["url"] = URI.parse(fmt["url"]).full_path }
|
|
|
|
end
|
|
|
|
end
|
|
|
@ -556,12 +576,12 @@ get "/embed/:id" do |env|
|
|
|
|
captions = video.captions
|
|
|
|
captions = video.captions
|
|
|
|
|
|
|
|
|
|
|
|
preferred_captions = captions.select { |caption|
|
|
|
|
preferred_captions = captions.select { |caption|
|
|
|
|
params[:preferred_captions].includes?(caption.name.simpleText) ||
|
|
|
|
params.preferred_captions.includes?(caption.name.simpleText) ||
|
|
|
|
params[:preferred_captions].includes?(caption.languageCode.split("-")[0])
|
|
|
|
params.preferred_captions.includes?(caption.languageCode.split("-")[0])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
preferred_captions.sort_by! { |caption|
|
|
|
|
preferred_captions.sort_by! { |caption|
|
|
|
|
(params[:preferred_captions].index(caption.name.simpleText) ||
|
|
|
|
(params.preferred_captions.index(caption.name.simpleText) ||
|
|
|
|
params[:preferred_captions].index(caption.languageCode.split("-")[0])).not_nil!
|
|
|
|
params.preferred_captions.index(caption.languageCode.split("-")[0])).not_nil!
|
|
|
|
}
|
|
|
|
}
|
|
|
|
captions = captions - preferred_captions
|
|
|
|
captions = captions - preferred_captions
|
|
|
|
|
|
|
|
|
|
|
@ -582,11 +602,11 @@ get "/embed/:id" do |env|
|
|
|
|
|
|
|
|
|
|
|
|
thumbnail = "/vi/#{video.id}/maxres.jpg"
|
|
|
|
thumbnail = "/vi/#{video.id}/maxres.jpg"
|
|
|
|
|
|
|
|
|
|
|
|
if params[:raw]
|
|
|
|
if params.raw
|
|
|
|
url = fmt_stream[0]["url"]
|
|
|
|
url = fmt_stream[0]["url"]
|
|
|
|
|
|
|
|
|
|
|
|
fmt_stream.each do |fmt|
|
|
|
|
fmt_stream.each do |fmt|
|
|
|
|
if fmt["label"].split(" - ")[0] == params[:quality]
|
|
|
|
if fmt["label"].split(" - ")[0] == params.quality
|
|
|
|
url = fmt["url"]
|
|
|
|
url = fmt["url"]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
@ -1236,6 +1256,14 @@ post "/preferences" do |env|
|
|
|
|
video_loop ||= "off"
|
|
|
|
video_loop ||= "off"
|
|
|
|
video_loop = video_loop == "on"
|
|
|
|
video_loop = video_loop == "on"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
annotations = env.params.body["annotations"]?.try &.as(String)
|
|
|
|
|
|
|
|
annotations ||= "off"
|
|
|
|
|
|
|
|
annotations = annotations == "on"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
annotations_subscribed = env.params.body["annotations_subscribed"]?.try &.as(String)
|
|
|
|
|
|
|
|
annotations_subscribed ||= "off"
|
|
|
|
|
|
|
|
annotations_subscribed = annotations_subscribed == "on"
|
|
|
|
|
|
|
|
|
|
|
|
autoplay = env.params.body["autoplay"]?.try &.as(String)
|
|
|
|
autoplay = env.params.body["autoplay"]?.try &.as(String)
|
|
|
|
autoplay ||= "off"
|
|
|
|
autoplay ||= "off"
|
|
|
|
autoplay = autoplay == "on"
|
|
|
|
autoplay = autoplay == "on"
|
|
|
@ -1314,6 +1342,8 @@ post "/preferences" do |env|
|
|
|
|
|
|
|
|
|
|
|
|
preferences = {
|
|
|
|
preferences = {
|
|
|
|
"video_loop" => video_loop,
|
|
|
|
"video_loop" => video_loop,
|
|
|
|
|
|
|
|
"annotations" => annotations,
|
|
|
|
|
|
|
|
"annotations_subscribed" => annotations_subscribed,
|
|
|
|
"autoplay" => autoplay,
|
|
|
|
"autoplay" => autoplay,
|
|
|
|
"continue" => continue,
|
|
|
|
"continue" => continue,
|
|
|
|
"continue_autoplay" => continue_autoplay,
|
|
|
|
"continue_autoplay" => continue_autoplay,
|
|
|
|