检测具有Youtube播放限制的视频

4
我正在使用Python开发Web服务,想要筛选出不能在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。 - user2173955
视频声称它是可嵌入的,并提供了一个可嵌入的SWF URL。然而,我无法测试它,因为在美国无法查看。你能找到一个全球可见但不能嵌入外部页面或应用程序的不同示例吗?(顺便说一句,https://www.youtube.com/watch?v=SC3pupLn-_8 是否与您发布的全屏、应用程序特定URL具有相同的行为?您是否测试过可嵌入的SWF URL或任何其他嵌入方式?当您使用它时会发生什么?) - abarnert
请尝试这个。我之前提到的链接是Flash播放器,但我的备用链接分辨率很差,它们是3gp格式的。请帮帮我... - user2173955
第二个在美国也不可用。但第一个说:“此视频在某些网站上无法播放。请在YouTube上观看。”这似乎是您要找的内容。如果您能提供一个合适的查询,我会查一下。 - abarnert
2个回答

4
一般来说,在进行搜索时使用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

1
如果我理解你的问题,你正在寻找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参数在检索结果之前进行后过滤。文档实际上给出了一个例子,只返回“不以任何方式限制回放的条目,这通过<yt:state>元素的存在来表示”。
entry[not(app:control/yt:state)]

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接