python - 生成指向 Youtube 音频的链接

标签 python audio hyperlink youtube

作为一个更大项目的一部分,我已经有一段时间了,试图找到一种无需下载相应文件即可将 Youtube AUDIO 流式传输到应用程序中的方法。

我现在拥有的是一个使用网络服务下载视频的程序,例如 saveyoutube.com .然而,这不是很有效。下载视频本身需要大约 5 分钟,客户可能会厌倦等待,直接使用 Youtube 界面即可。另外,假设程序的用户希望访问 4 小时长的专辑。然而,他们只想听其中的特定部分,为了解释起见,假设用户想看 2 小时后的视频(例如,拍摄 this 视频)。

毫无疑问,我的程序也适用于此,但音乐开始播放大约需要 20 分钟(因为下载 2 小时的音频需要很多时间)。此外,到那时我已经用完了用户计算机上大约 400 兆字节的空间。当然,我可以将文件存储在一个临时文件夹中,并在他们关闭程序后将其删除,但这会导致更多问题:

  1. 如果程序在下载完成前 1 分钟因空间不足(谁知道客户的计算机上有什么)而崩溃,客户将白白浪费大约 20 分钟的时间。

  2. 说下一次他们加载程序时,他们希望做同样的事情。然后他们必须再等 20 分钟。这可以通过在界面上添加“保存音频”按钮来解决,这将防止程序在关闭时删除文件。然而,第一个僵局仍然存在。

所以这是我的问题:有没有办法生成指向 AUDIO 的链接 YouTube视频?有没有办法获得像http://www.youtube.com/watch?v=AOARzA8nGu4.(AUDIOEXTENSION这样的网址? )?这样跳到配乐中的某个部分会更容易,并且不需要下载。我对此研究了很长时间,到目前为止,最接近答案的是 saveyoutube:mp3 下载器。

这甚至可以做到吗?如果没有,是否有 Youtube 的替代方案可以做到这一点?我调查了 Youtube API ,但这又是不利的,因为与大多数 Google 服务一样,它的 API 是有限的。

编程语言不受限制,因为大多数代码都可以翻译。但是,Python 或 C/C++ 解决方案将是理想的。

提前致谢!

附言我有一个可用的服务器,但我非常不愿意将所有 Youtube 视频下载到服务器上。但是,如果有另一种涉及服务器的解决方案不涉及窃取整个 Youtube,那就太好了。

最佳答案

经过大量研究,我找到了解决方案。在没有获得音频链接的情况下,我创建了一个程序来无形地播放 YouTube 视频,因此可以播放“音频”,这是我的意图。

我编写的程序使用了大量已经可用的 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, 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()

播放视频。就我而言,我不想拥有 GUI,所以我删除了“frame.Show(True)”行。如果您想测试它,请尝试像“http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US”这样的链接',我稍后会解释。

但是,这不允许暂停等,因此必须使用其他方法。

要开始自动播放:将“&autoplay=1”添加到 URL

暂停的方法如下:

您可以生成视频长度 youtube-dl模块,并在用户暂停时终止线程。但是,您可以存储已经播放的时间,下次您可以添加“&start=SECONDSPLAYED”,这将有效地“恢复”视频。可以找到有关此的详细信息 here .

此外,您必须使用 YouTube 嵌入网址,这是唯一有效的网址。一个示例看起来像“http://www.youtube.com/v/cP6lppXT-9U?version=3&hl=en_US

优点

  • 法律*
  • 快速的 Flash 加载时间(0.01 秒基准)
  • 不浪费空间
  • 可以跳到结尾而不下载整个文件
  • 无限使用,因为不使用 YouTube API

*根据YouTube's terms of service ,第 4 节:服务的一般使用——许可和限制,第 3 小节。

You agree not to access Content through any technology or means other than the video playback pages of the Service itself, the Embeddable Player, or other explicitly authorized means YouTube may designate.

由于该程序使用了一个主要使用可嵌入播放器的备用界面,并且没有做任何完全非法的事情(比如下载文件 [我的第一个想法])。

缺点

  • 由于依赖于 ActiveX,此应用程序不能在 Windows 以外的任何操作系统上运行。
  • 据我认识的人说,很少有人使用 Internet Explorer。唉,这个程序需要安装 INTERNET EXPLORER Flash;不是 Mozzila Flash,Chrome Flash。它绝对必须是 IE。否则,应用程序会加载,但视频不会出现。
  • wx 需要很长时间才能加载(大约 10 秒)。

依赖关系

  • 由于显而易见的原因,必须使用 wxPython。
  • 必须安装 Python comtypes(找到 here)。否则,wxPython 无法与 ActiveX 通信。

有用的功能

我还创建了一些函数来为正在做同样事情的任何人加快这个过程。

都是不错的单行 lambda。

generate_link:返回 YouTube 嵌入 URL,给定一个普通的 YouTube URL。

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)

自动播放:可能是最简单的,将自动播放设置为 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

因此,我解析了实际的视频页面以获取长度。有点慢,但不会失败。

关于python - 生成指向 Youtube 音频的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10574290/

相关文章:

python - python 列表是否具有用于测试身份的 __contains__ 的等价物?

Android:来自音频的外部硬件中断

java - 通过java上传图片后检索imgur上传链接

javafx - 如何将 actionListener 添加到 JavaFx 中的标签

python - 数组中的行式元素搜索

python - pydoc 生成带有文件句柄参数的帮助文本

iphone - 我可以在iPhone上访问短信声音吗?

ios - 播放声音时禁用 UIButton AVAudioplayer

excel - 超链接excel公式

python - 在Python中将 "§"键绑定(bind)到按钮