Xye*_*ene 6 python youtube audio hyperlink
我已经有一段时间了,作为一个更大的项目的一部分,试图找到一种方法将Youtube AUDIO流式传输到应用程序而无需下载相应的文件.
我现在拥有的是一个使用saveyoutube.com等网络服务下载视频的程序.然而,这不是非常有效.下载视频本身大约需要5分钟,客户可能会厌倦等待并直接使用Youtube界面.此外,假设节目的用户希望访问长达4小时的专辑.但是,他们只想听一下它的特定部分,为了便于解释,让我们说用户想要从2小时开始看视频(例如,拍摄此视频).
毫无疑问,我的程序也适用于此,但音乐开始播放大约需要20分钟(因为下载2小时的音频需要很多时间).此外,到那时,我已经在用户的计算机上耗尽了大约400兆字节的空间.当然,我可以将文件存储在临时文件夹中,并在关闭程序后将其删除,但这会导致更多问题:
如果程序在下载完成之前1分钟崩溃,因为空间不足(谁知道客户端在他们的计算机上有什么),那么客户端将浪费大约20分钟的时间.
假设下次加载程序时,他们希望做同样的事情.然后他们必须再等20分钟.这可以通过向界面添加"保存音频"按钮来实现,这可以防止程序在关闭时删除文件.然而,第一个问题仍然存在.
所以这是我的问题:有没有办法生成Youtube视频的音频链接?有没有办法获得像http://www.youtube.com/watch?v=AOARzA8nGu4.(AUDIOEXTENSION)这样的网址?这样跳到音轨中的一部分会更容易,并且不需要下载.我已经研究了很长一段时间了,到目前为止,最接近答案的是WAS saveyoutube:一个mp3下载器.
这甚至可能吗?如果没有,是否有替代Youtube可以做到这一点?我已经研究过Youtube API,但这又是不利的,就像大多数Google服务一样,它的API也是有限的.
编程语言不是限制,因为大多数代码都可以翻译.但是,Python或C/C++解决方案将是理想的选择.
提前致谢!
PS我有一台可用的服务器,但我非常不愿意将所有Youtube视频下载到服务器上.但是,如果有另一个涉及服务器的解决方案不涉及扯掉整个Youtube,那就太棒了.
经过大量的研究,我找到了解决方案.虽然没有获得音频的LINKS,但我创建了一个无形播放YouTube视频的节目,因此可以播放'AUDIO',这是我的意图.
我编写的程序使用了许多已经可用的Python模块来实现目标.
我找到了这个链接,它解释了如何通过wxPython(在这里找到)将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, parent, -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()
Run Code Online (Sandbox Code Playgroud)
播放视频.在我的情况下,我不想拥有GUI,所以我删除了' frame.Show(True)'行.如果您想测试它,请尝试使用" http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=zh_CN " 这样的链接,我稍后会解释.
但是,这不允许暂停等.因此,必须使用其他方法.
要开始自动播放:&autoplay=1在URL中添加一个' '
以下是暂停的方法:
您可以使用youtube-dl模块生成视频长度,并在用户暂停时终止该线程.但是,您将存储已播放的时间,下次您将添加' &start=SECONDSPLAYED',这将有效地"恢复"视频.有关详细信息,请参见此处.
此外,您必须使用YouTube嵌入式网址,这是唯一有效的网址.一个例子看起来像' http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US'
优点
*根据YouTube的服务条款,第4节:服务许可和限制的一般使用,第3小节.
您同意不通过本服务的视频播放页面,嵌入式播放器或YouTube可能指定的其他明确授权方式之外的任何技术或方式访问内容.
由于该程序使用主要使用Embeddable Player的备用接口,并且没有做任何完全非法的事情(比如下载文件[我的第一个想法]).
缺点
依赖
有用的功能
我还创建了一些函数来加速任何正在做同样事情的人的过程.
所有这些都是很好的单线羔羊.
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'
Run Code Online (Sandbox Code Playgroud)
start_from:接受开始播放视频的小时,分钟和秒,并返回一个链接.
start_from = lambda hours, minutes, seconds, link: link + '&start=' + str((hours*60*60)+(minutes*60)+seconds)
Run Code Online (Sandbox Code Playgroud)
autoplay:可能是最简单的,将autoplay设置为true,并返回一个链接.它接受一个链接.
autoplay = lambda link: link + '&autoplay=1'
Run Code Online (Sandbox Code Playgroud)
video_length:返回视频的长度.有用,接受YouTube链接.
video_length = lambda video: re.compile(r'length_seconds=(.*?)\\', re.S).search(urllib2.urlopen(video).read()).group(1).strip()
Run Code Online (Sandbox Code Playgroud)
这意味着许可视频将返回错误这一事实的解决方法
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
Run Code Online (Sandbox Code Playgroud)
因此,我解析了实际的视频页面以获得长度.有点慢,但工作没有失败.
| 归档时间: |
|
| 查看次数: |
3402 次 |
| 最近记录: |