Last.fm的声学指纹绑定(fplib)

pylastfp的Python项目详细描述


这是一个到last.fm的声学指纹库(称为 fplib)及其相关的api服务。它执行指纹提取, 指纹ID查找和跟踪元数据查找。

安装

要安装,您需要一个编译器和fplib所需的依赖项 本身:fftw(为单精度浮点编译)和libsamplerate。 (在debian/ubuntu上,包是libfftw3-devlibsamplerate0-dev

一旦有了这些,就可以使用pip

$ pip install pylastfp

或者,如果您没有pip(或easy_install),请前往download page。 正常的安装命令应该可以工作:

$ python setup.py install

从版本控制源(即,不是从发行版)构建 你还需要Cython。(源分布包括 生成的C++文件,避免了Cython的需要。这个包裹是 setup.py会耍花招来检测您是否安装了cython。)

这个库还依赖于audioread来解码音频,尽管 依赖性在技术上是可选的。如果你已经有了解码机制 音频文件,无需安装AudioRead。

运行

您可以运行包含的fingerprinter/lookup脚本lastmatch.py, 要测试您的安装:

$ lastmatch.py mysterious_music.mp3

这将显示来自last.fm数据库的元数据匹配。脚本使用 audioread解码音乐,因此应该透明地使用媒体库 在您的系统上可用(GStreamer、FFMPEG、MAD或Mac OS X上的核心音频)。

在代码中使用

脚本展示了使用pylastfp的常用方法,即:

>>> import lastfp
>>> xml = lastfp.match_file(apikey, path)
>>> matches = lastfp.parse_metadata(xml)
>>> print matches[0]['artist'], '-', matches[0]['title']
The National - Fake Emprire

本例使用match_file便利函数,该函数使用 audioread解码音频数据。函数导入audioread模块 打电话的时候,如果你不想依赖这个,就不要打这个 功能。

如果你有自己的音频解码方法,你可以使用较低级别 接口:

>>> xml = lastfp.match(apikey, pcmdata, samplerate, time_in_secs)

当然,您需要一个pcm流用于您想要的音频 指纹。pcmdata参数必须是python的iterable strbuffer对象,包含作为c^{tt9}数组的pcm数据$ (16位整数)值。

两个函数(matchmatch_file)都接受一个附加的可选 参数名为metadata。应该是一个包含你当前猜测的口述 在文件的元数据中。last.fm可能会使用这些信息来改进 数据库。dict应该使用这些键(所有键都是可选的): "artist""album""track"

该模块在内部执行线程安全api,每个限制为5个查询 第二,按照Last.fm’s API TOS

待办事项

指纹库允许跳过解码的优化 在每个文件的开头几毫秒。(见 FingerprintExtractor::getToSkipMs(),如 example client)利用这一点将使模块的 因为解码源需要知道 是时候跳过了。

版本历史记录

0.6
使用audioread而不是包含的pygstpymad解码器。
0.5
处理来自api的空响应。 setup.py现在搜索Homebrew用户本地前缀。
0.4
修复gstdec中导致文件保持打开状态的清除错误。
0.3
修复处理http错误时的拼写错误。 处理HTTP状态行格式不正确的情况。
0.2
修复可怕的内存泄漏。 文件太短时安全失败。 安全处理从api返回的格式错误的xml。 处理并公开http失败。
0.1
初始版本。

学分

这个库由Adrian Sampson提供。它包括fplib源代码,其中 是由Last.fm。fplib是在lgplv3下授权的,因此pylastfp使用相同的 许可证pylastfp被编写为与beets一起使用,您应该 可能去看看吧。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
spring引导服务器忽略java上载请求   java多个驼峰路由会导致大量线程吗?   java 安卓单签入回收器gridLayout管理器   Java中指向类的不同实例的对象数组   java的启动/停止和打开/关闭等分组功能是否违反了单一责任原则?   java hibernate组件映射与自定义值类型   java如何使用不同的JDK在Jenkins作业中使用JDK8   java从匹配器获取字符串的特定部分   java通过在Spark数据框内的数组列中映射来创建新列   servlet的java Tomcat配置   java多个活动不在一个应用程序安卓 studio中   javajsf:view beforePhase在我离开页面时多次触发   javascript如何使用“java脚本”进行加密,使用和“java”进行解密   java My App不是从URL ASPX读取简单的JSON   java在RESTish web服务中应用DDD原则