python – 生成Youtube音频的链接
我已经有一段时间了,作为一个更大的项目的一部分,试图找到一种方法将Youtube AUDIO流式传输到应用程序而无需下载相应的文件.
我目前所拥有的是一个使用诸如saveyoutube.com之类的网络服务下载视频的程序.但这并不是非常有效.下载视频本身大约需要5分钟,客户可能会厌倦等待并直接使用Youtube界面.此外,假设节目的用户希望访问长达4小时的专辑.但是,他们只想听一下它的特定部分,为了便于解释,让我们说用户想要从2小时开始看视频(例如,拍摄this视频). 毫无疑问,我的程序也适用于此,但音乐开始播放大约需要20分钟(因为下载2小时的音频需要很多时间).此外,到那时,我已经在用户的计算机上耗尽了大约400兆字节的空间.当然,我可以将文件存储在临时文件夹中,并在关闭程序后将其删除,但这会导致更多问题: >如果程序在下载完成前1分钟崩溃,因为空间不足(谁知道客户端在他们的计算机上有什么),那么客户端将浪费大约20分钟的时间而无所事事. 所以这是我的问题:有没有办法生成到AUDIO的链接 这甚至可能吗?如果没有,是否有替代Youtube可以做到这一点?我已经调查了Youtube API,但这又是不利的,就像大多数Google服务一样,它的API也是有限的. 编程语言不是限制,因为大多数代码都可以翻译.但是,Python或C/C++解决方案将是理想的选择. 提前致谢! 附:我有一台可用的服务器,但我不太愿意将所有Youtube视频下载到服务器上.但是,如果有另一个涉及服务器的解决方案不涉及扯掉整个Youtube,那就太棒了. 解决方法
经过大量的研究,我找到了解决方案.虽然没有获得音频的LINKS,但我创建了一个无形播放YouTube视频的节目,因此可以播放’AUDIO’,这是我的意图.
我编写的程序使用了许多已经可用的Python模块来实现目标. 我找到了this链接,它解释了如何通过wxPython(找到here)将Flash嵌入到Python应用程序中.它有一个activexwrapper模块,我用它来播放Flash. 码: import wx if wx.Platform == '__WXMSW__': from wx.lib.flashwin import FlashWindow class MyPanel(wx.Panel): def __init__(self,parent,id): wx.Panel.__init__(self,-1) self.pdf = None sizer = wx.BoxSizer(wx.VERTICAL) btnSizer = wx.BoxSizer(wx.HORIZONTAL) self.flash = FlashWindow(self,style=wx.SUNKEN_BORDER) sizer.Add(self.flash,proportion=1,flag=wx.EXPAND) #sizer.Hide(0) self.SetSizer(sizer) self.SetAutoLayout(True) print "Importing Flash..." self.flash.LoadMovie(0,raw_input('Copy link for flash: ')) #Used to load a flash file. You may also give a location of a specific file on disk. print "Done." app = wx.PySimpleApp() # create window/frame,no parent,-1 is default ID,title,size # change size as needed frame = wx.Frame(None,-1,"Flash Stream",size = (500,400)) # make instance of class,-1 is default ID MyPanel(frame,-1) # show frame frame.Show(True) #comment if you don't want to see the ui print "Started" # start event loop app.MainLoop() 播放视频.在我的情况下,我不想拥有GUI,所以我删除了’frame.Show(True)’行.如果您想测试它,请尝试像’http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US‘这样的链接,我稍后会解释. 但是,这不允许暂停等.因此,必须使用其他方法. 要开始自动播放,请在网址中添加“& autoplay = 1” 以下是暂停的方法: 您可以使用youtube-dl模块生成视频长度,并在用户暂停时终止该线程.但是,您将存储已播放的时间,下次您将添加“& start = SECONDSPLAYED”,这将有效地“恢复”视频.有关详细信息,请参见here. 此外,您必须使用YouTube嵌入式网址,这是唯一有效的网址.示例如“http://www.youtube.com/v/cP6lppXT-9U?version=3u0026amp;hl=en_US” 优点 >法律* *根据YouTube’s terms of service,第4节:服务许可和限制的一般使用,第3小节.
由于该程序使用主要使用Embeddable Player的备用接口,并且没有做任何完全非法的事情(比如下载文件[我的第一个想法]). 缺点 >由于依赖ActiveX,此应用程序不适用于任何操作系统但Windows. 依赖 >出于显而易见的原因,必须使用wxPython. 有用的功能 我还创建了一些函数来加速任何正在做同样事情的人的过程. 所有这些都是很好的单线羔羊. generate_link:在给定普通YouTube网址的情况下返回YouTube嵌入网址. generate_link = lambda link: 'http://www.youtube.com/v/'+re.compile(r'watch?v=(.*?)(?:&|$)').search(link).group(1)+'?version=3&hl=en_US' start_from:接受开始播放视频的小时,分??钟和秒,并返回一个链接. start_from = lambda hours,minutes,seconds,link: link + '&start=' + str((hours*60*60)+(minutes*60)+seconds) autoplay:可能是最简单的,将autoplay设置为true,并返回一个链接.它接受一个链接. autoplay = lambda link: link + '&autoplay=1' video_length:返回视频的长度.有用,接受YouTube链接. video_length = lambda video: re.compile(r'length_seconds=(.*?)',re.S).search(urllib2.urlopen(video).read()).group(1).strip() 这意味着许可视频将返回错误这一事实的解决方法 status=fail&errorcode=150&reason=This+video+contains+content+from+WMG.+It+is+restricted+from+playback+on+certain+sites.%3Cbr%2F%3E%3Cu%3E%3Ca+href%3D%27http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DVALbSjayAgw%26feature%3Dplayer_embedded%27+target%3D%27_blank%27%3EWatch+on+YouTube%3C%2Fa%3E%3C%2Fu%3E 因此,我解析了实际的视频页面以获得长度.有点慢,但工作没有失败. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |