首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大多数没有从VideoUrl获得YouTube的视频

大多数没有从VideoUrl获得YouTube的视频
EN

Stack Overflow用户
提问于 2014-05-02 09:30:36
回答 3查看 3.8K关注 0票数 8

我使用"info“获取视频信息、缩略图图像和视频URL

若要在自定义视频播放器中播放视频,请单击"vevo通道“视频。

它不返回任何视频URL。我还尝试了"get_video_info“api中的不同参数。例子:

&gl=US&ps=default

&gl=US&ps=default

&gl=US&ps=default

id=0KSOMA3QBU0&eurl=&el=&gl=US&ps=default

有很多视频没有得到视频信息。有以下视频,它没有获得视频信息.

3zBUKM8

https://www.youtube.com/watch?v=kHue-HaXXzg

-deVemE

https://www.youtube.com/watch?v=CevxZvSJLk8

https://www.youtube.com/watch?v=CEUg7OplvIQ

,但我们可以在application.Example现场播放这段视频

https://play.google.com/store/apps/details?id=com.tfsapps.playtube2

https://itunes.apple.com/in/app/itube-playlist-management/id789819758?mt=8

https://itunes.apple.com/ca/app/itube-free-music-playlists/id866761482?mt=8

怎么可能??

如果我想播放所有的视频,那么解决方案是什么??

EN

回答 3

Stack Overflow用户

发布于 2014-05-06 02:54:59

从videoUrl检索YouTube的url是https://www.youtube.com/get_video_info?video_id=/*videoId*/&el=vevo&el=embedded&asv=3&sts=15902

下面是如何通过videoUrl通过videoId。Lua代码:

代码语言:javascript
复制
-- string.explode(string, separator)
function string.explode(p, d)
  local t, i
  t={}
  i=0
  if(#p == 1) then return {p} end
    while true do
      l=string.find(p,d,i,true)
      if l~=nil then
        table.insert(t, string.sub(p,i,l-1))
        i=l+1
      else
        table.insert(t, string.sub(p,i))
        break
      end
    end
  return t
end

-- string.begin_with
function string.begin_with(str, sub_str)
   return string.find(str, sub_str)==1
end

-- string.url_decode
function string.url_decode(str)
  str = string.gsub (str, "+", " ")
  str = string.gsub (str, "%%(%x%x)", function(h) return string.char(tonumber(h,16)) end)
  str = string.gsub (str, "\r\n", "\n")
  return str
end

-- string.url_query_parameter_map
function string.url_query_parameter_map(str)
    local params_kv = {}
    for k,v in pairs(string.explode(str, "&")) do
        local eqmark_idx = string.find(v, "=")
        if eqmark_idx ~= nil and eqmark_idx > 1 and eqmark_idx < string.len(v) then
            local param_name = string.sub(v, 1, eqmark_idx-1)
            local param_value = string.sub(v, eqmark_idx+1)
            param_name = string.url_decode(param_name)
            param_value = string.url_decode(param_value)
            --print (param_name .." => " .. param_value)
            params_kv[param_name] = param_value
        else
            params_kv[string.url_decode(v)] = ""
        end
    end
    return params_kv
end

function string.ytb_sig_charswap(str, pos)
    local c1 = string.sub(str,1,1)
    local pos2 = (pos-1)%string.len(str)+1--lua has index begun at 1!
    local c2 = string.sub(str,pos2,pos2)

    return c2..string.sub(str,2,pos2-1)..c1..string.sub(str,pos2+1)
end

-- string.ytb_sig_decrypt
function string.ytb_sig_decrypt(str)
    local sig = str
    sig = string.sub(sig, 3)
    sig = string.reverse(sig)
    sig = string.sub(sig, 4)
    sig = string.ytb_sig_charswap(sig, 10)
    sig = string.sub(sig, 4)
    sig = string.ytb_sig_charswap(sig, 44)
    sig = string.sub(sig, 4)
    sig = string.reverse(sig)
    sig = string.ytb_sig_charswap(sig, 24)
    return sig
end

--local s = "YFRHVIIsjrkkiGDtqKXrh847DI5GKDKokWjjgougGDLanT2rw92V6cuXY5BfPGMsaLwgGUYV76wr1T6W"
--print(string.ytb_sig_decrypt(s))

-- define the parser function
-- return: number of video resource, table of video resources, failed reason text.
parse = function (s)
    local params_kv = string.url_query_parameter_map(s)
    -- print(params_kv["fmt_list"]);
    local fmt_list, fmt_stream = params_kv["fmt_list"],  params_kv["url_encoded_fmt_stream_map"]
    local reason, rental_bar = params_kv["reason"], params_kv["ypc_video_rental_bar_text"]

    if (fmt_list == nil or fmt_stream == nil) then
        local reason_text = "reason="
        if (reason ~= nil) then 
            reason_text = reason_text .. reason
        elseif (rental_bar ~= nil) then 
            reason_text = reason_text .. rental_bar
        else 
            reason_text = "reason=This video cannot be played for some unknown reason(unexpected)"
        end
        return 0, {}, reason_text
    end

    print(fmt_list)
    --local fmt_infos = {}
    --for k,v in pairs(string.explode(fmt_list, ",")) do
    --  local fmt_info = string.explode(v, "/")
    --  local v_itag, v_reso = fmt_info[1], fmt_info[2] 
    --  fmt_infos[v_itag]=v_reso
    --  print (v_itag.." => "..v_reso)
    --end

    local stream_n, stream_infos = 0, {}
    for k,v in pairs(string.explode(fmt_stream, ",")) do
        local s_info = string.url_query_parameter_map(v)
        local v_itag, v_url, v_s, v_sig = s_info["itag"], s_info["url"], s_info["s"], s_info["sig"]
        --print (v_itag.." => "..v_url)
        --print ((v_s or "nil").." ~ "..(v_sig or "nil"))
        if (string.find(v_url, "signature=") ~= nil) then
            v_url = v_url
        elseif (v_sig ~= nil) then
            v_url = v_url.."&signature="..v_sig
        elseif (v_s ~= nil) then
            v_url = v_url.."&signature="..string.ytb_sig_decrypt(v_s)
        else
            v_url = v_url
        end
        stream_infos[v_itag] = v_url
        stream_n=stream_n+1
        print (v_itag.." => "..v_url)
    end

    return stream_n, stream_infos, ""
end

-- multiple return values:
-- the first one is script version number.
-- the second one is remote YouTube URL for fetching, with one parameter placeholder "%s".
-- the third one is the parser entry function object.
return "14.3.5", "https://www.youtube.com/get_video_info?video_id=%s&el=vevo&el=embedded&asv=3&sts=15902", parse

你可以把它翻译成目标C代码。

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2021-08-10 22:25:04

Youtube不允许你播放包含版权的视频。所有可播放的视频将是免费的使用和免费的权利。从2021年7月开始,"get_video_info“返回"410 - gone",我猜谷歌的某个人遇到了危机,视频可以在youtube之外播放。需要"get_video_info“吗?你可以用我的NuGet https://www.nuget.org/packages/Youtube.VideoInfo

享受吧!

票数 0
EN

Stack Overflow用户

发布于 2014-05-02 09:47:20

这种类型的视频只能在真正的网站上才能播放。我们不会通过API公开这些列表。

这篇博客文章也有更多的细节:

http://apiblog.youtube.com/2011/12/understanding-playback-restrictions.html

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23424908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档