【问题标题】:Detect videos with Youtube playback restriction检测具有 Youtube 播放限制的视频
【发布时间】:2012-12-09 10:01:48
【问题描述】:

我正在使用 python 开发网络服务,我想过滤掉无法在 youtube 页面之外播放的视频。

喜欢这个链接 [https://www.youtube.com/v/SC3pupLn-_8?version=3&f=videos&app=youtube_gdata] 您必须在 youtube 页面上观看视频,是否有任何方法可以过滤哪些视频属于同一类别。所以我只选择那些可以不受限制地播放的视频。

import gdata.youtube.service
#------------------------------------------------------------------------------ 

yt_service = gdata.youtube.service.YouTubeService()
yt_service.developer_key = 'YOUR API DEVELOPER KEY'

count=0

def PrintEntryDetails(entry):

    if entry.media.category[0].text == "Movies" :
        global count
        count = count + 1
        if  entry.noembed != None:
            print 'Video embedding not enable: %s' % entry.noembed.text
        else :
            print "entry embedable"

        print 'Video title: %s' % entry.media.title.text
        print 'Video category: %s' % entry.media.category[0].text
        print 'Video published on: %s ' % entry.published.text
        print 'Video description: %s' % entry.media.description.text
        if entry.media.private != None :
            print entry.media.private.text
        else :
            print "Right not found"          
        if entry.media.keywords :
            print 'Video tags: %s' % entry.media.keywords.text
        print 'Video watch page: %s' % entry.media.player.url
        print 'Video flash player URL: %s' % entry.GetSwfUrl()
        print 'Video duration: %s' % entry.media.duration.seconds        
        # For video statistics
        if entry.statistics :       
            print 'Video view count: %s' % entry.statistics.view_count
        # For video rating
        if entry.rating  :    
            print 'Video rating: %s' % entry.rating.average
        # show alternate formats
        for alternate_format in entry.media.content:
            if 'isDefault' not in alternate_format.extension_attributes:
                print 'Alternate format: %s | url: %s ' % (alternate_format.type,
                                                     alternate_format.url)
        # show thumbnails
        for thumbnail in entry.media.thumbnail:
            print 'Thumbnail url: %s' % thumbnail.url        
        print "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
    else :
        pass

def PrintVideoFeed(feed):
    counter = 0    
    for entry in feed.entry:        
        PrintEntryDetails(entry)
        counter = counter+1
        #print counter   


def SearchAndPrint():
    max = 20    
    yt_service = gdata.youtube.service.YouTubeService()
    query = gdata.youtube.service.YouTubeVideoQuery()
    # OrderBy must be one of: published viewCount rating relevance 
    query.orderby = "relevance"
    query.racy = 'include'
    query.author = "tseries"
    query.max_results = 50
    index = 01
    for i in (range(max)):        
        query.start_index = index
        index = index + 50
        query.format = "5"
        feed = yt_service.YouTubeQuery(query)    
        PrintVideoFeed(feed)


SearchAndPrint()
print "**********************************************************"
print "Total Movies"
print count

【问题讨论】:

  • 有没有办法知道这个视频不能在youtube网站外播放。使用python
  • 该视频声称它是可嵌入的,并提供了一个可嵌入的 SWF URL。但是,我无法对其进行测试,因为它在美国看不到。您能找到一个在全球范围内都可以查看但不能嵌入到外部页面或应用程序中的不同示例吗? (PS,youtube.com/watch?v=SC3pupLn-_8 是否与您发布的全屏、特定于应用程序的 URL 具有相同的行为?您是否测试过可嵌入的 SWF URL 或任何其他嵌入方式?使用它时会发生什么?)跨度>
  • link link请试试这个。我前面提到的网址是用于 Flash 播放器的,我有该视频的备用网址,但它们的分辨率非常糟糕,它们是 3gp 格式。请帮助我出...
  • 第二个在美国再次不可用。但第一个说“这个视频......在某些网站上被限制播放。在 YouTube 上观看。”这似乎就是你要找的东西。我会看看,如果你能提供一个适当的查询来返回这个……

标签: python youtube-api gdata-api


【解决方案1】:

一般的答案是在执行搜索时使用format=5 参数:https://developers.google.com/youtube/2.0/reference#formatsp

这将从搜索结果中过滤掉完全禁用嵌入的视频。

话虽如此,有些视频已启用嵌入,但只能在某些区域或嵌入某些域时播放。

要处理区域限制,您应该将restriction= 参数设置为适合您的用例的参数,如https://developers.google.com/youtube/2.0/reference#restrictionsp 中所述

不过,无法从具有域级嵌入限制的搜索结果中排除视频。

这篇博文有更多关于嵌入式播放限制的一般信息:http://apiblog.youtube.com/2011/12/understanding-playback-restrictions.html

【讨论】:

    【解决方案2】:

    如果我理解您的问题,您正在寻找app:control/yt:state 标签。例如,如果视频被限制在 YouTube 网站上播放,但您尝试通过嵌入式 URL 或非浏览器访问它,您会得到如下信息:

    <app:control>
        <yt:state name="restricted" reasonCode="limitedSyndication">Syndication of this video was restricted.</yt:state>
    </app:control>
    

    您可以在 entry 对象中看到:

    entry.control.FindExtensions('state')[0].attributes
    

    这将是:

    {'name': 'restricted', 'reasonCode': 'limitedSyndication'}
    

    当然你需要让它更健壮——control 可能是 None,它可能没有 state 标签等。但你明白了。

    我认为您不能直接搜索state 的存在或不存在或特定值,但您可以使用fields 参数在检索结果之前对结果进行后过滤。文档实际上给出了仅返回“不以任何方式限制播放的条目,这由 &lt;yt:state&gt; 元素的存在表示”的示例:

    entry[not(app:control/yt:state)]
    

    我已经省略了 (title,media:group) 部分,因为您需要默认标签,而不是有限的集合。

    由于某种原因,fields 参数并不总是被发送。这可能是因为,正如docs 所说,“fields 参数当前仅用于实验功能。”但无论如何,您可以自己检索所有内容并过滤control

    【讨论】:

      猜你喜欢
      • 2015-11-12
      • 2017-02-16
      • 2014-07-04
      • 2012-11-22
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 2011-12-12
      • 2014-05-01
      相关资源
      最近更新 更多