c0dex / acoustid
acoustid.org 音频指纹搜索服务的 PHP 封装
Requires
- php: ^7.3
- ext-curl: *
- ext-json: *
- guzzlehttp/guzzle: ~6.0
Requires (Dev)
- filp/whoops: ^2.7
- james-heinrich/getid3: ^1.9
- phpstan/phpstan: ^0.11.12
- phpunit/phpunit: ^9.1
- squizlabs/php_codesniffer: 3.*
- symfony/var-dumper: *
- vlucas/phpdotenv: ^4.1
This package is auto-updated.
Last update: 2024-09-06 05:07:25 UTC
README
此项目是围绕 Acoustid.org Web 服务 API 的 PHP 封装。
安装
您可以通过克隆此存储库。
git clone https://github.com/psilocyberunner/acoustid-php.git
但最简单的方法是要求从 Composer 仓库中的 Composer 仓库中的 包
composer require c0dex/acoustid
用法
库支持 AcoustId API 的以下功能
- 通过音频指纹查找
- 通过曲目 ID 查找
- 提交音频指纹
- 获取数据提交状态
- 按 MBID(MusicBrainz ID)列出 AcoustID
用法
安装后,您应初始化库。这里我使用 Dotenv 包来避免在 PHP 文件中存储凭据。我还使用异常处理器 - Whoops,您可以使用您偏好的任何一种。
<?php #bootstrap.php # I use Dotenv package for config management (optional) $dotenv = Dotenv\Dotenv::create(__DIR__ . '/../'); $dotenv->load(); $dotenv->required(['API_APPLICATION_TOKEN', 'API_USER_TOKEN'])->notEmpty(); # Set exception handler (optional) $whoops = new \Whoops\Run; $whoops->prependHandler(new \Whoops\Handler\PrettyPageHandler); $whoops->register();
通过指纹查找
这里您应传递两个必需的参数 - 持续时间和指纹。这两者都可以从 fpcalc 实用程序中获取。
fpcalc 的用法
fpcalc -json ./mp3/some-track.mp3
您将得到类似以下内容
{"duration": 255, "fingerprint": "AQADtF8SZUkSRZjyzEMo.....long string"}
在 PHP 中解码数据并准备创建 API 调用。
<?php require_once '../vendor/autoload.php'; # Composer autoloader require_once 'bootstrap.php'; # See contents of bootstrap at the beginning # Here you can change getenv('API_APPLICATION_TOKEN') to your API token without getenv() $lookUp = new \AcoustId\LookUp\FingerPrint(getenv('API_APPLICATION_TOKEN')); $result = $lookUp->setJSONResponseType() # I want JSON response here (JSON is default) ->setMetaData([ # Choose what meta data you want. See API details for info \AcoustId\LookUp::META_RECORDINGS, \AcoustId\LookUp::META_RELEASES, \AcoustId\LookUp::META_USERMETA, \AcoustId\LookUp::META_RECORDINGIDS, ])->lookUp(255, 'AQADtF8SZUkSRZjyzEMo...'); # Data from fpcalc for certain media track # View the response (all examples should have the same lines at the end) echo $result->getBody()->getContents();
示例响应
{ results:[ { id:"5dfed459-fd8f-40d7-9d93-...", recordings:[ {}, {} ], score:0.926028 } ], status:"ok" }
通过 TrackId 查找
这里您应传递作为主要参数的 track id(UUID)。
<?php require_once '../vendor/autoload.php'; require_once 'bootstrap.php'; $trackId = new \AcoustId\LookUp\TrackId(getenv('API_APPLICATION_TOKEN')); # Optional response type JSONP and callback //$lookUp->setFormat('jsonp')->setJsonCallBack('testCallback'); $trackId->setMetaData([ \AcoustId\LookUp::META_RECORDINGS, \AcoustId\LookUp::META_RECORDINGIDS, ]); $result = $trackId->lookUp('5dfed459-fd8f-40d7-9d93-...');
示例响应
{ results:[ { id:"5dfed459-fd8f-40d7-9d93-...", recordings:[ { id:"180a17dd-f456-4ff2-be39-..." }, {...}, { id:"c6b6ea6b-52a7-46b3-9821-..." } ], score:1 } ], status:"ok" }
提交音频指纹
如果您希望使用自己的数据支持 AcoustId 数据库 - 您还需要用户 API 令牌(第二个,仅用于数据提交请求)。在此代码示例中,我使用 getId3 library 从 mp3 文件中提取 ID3 标签。
<?php require_once '../vendor/autoload.php'; require_once './bootstrap.php'; $dir = __DIR__ . '/..'; $x = exec(escapeshellcmd('fpcalc -json ./../mp3/some-track.mp3'), $output, $return); $data = json_decode($output[0]); $id3 = new getID3(); $file1 = $id3->analyze('./../mp3/some-track.mp3'); $submission = new \AcoustId\Submission(getenv('API_APPLICATION_TOKEN')); $result = $submission->setJSONResponseType() ->setWait(1) # How long to wait for request to be processed ->setDuration($data->duration) ->setUserToken(getenv('API_USER_TOKEN')) # User's API token ->setFingerPrint($data->fingerprint) ->setAlbumArtist($file1['id3v2']['comments']['artist'][0]) # Array structure for ->setTrackTitle($file1['id3v2']['comments']['title'][0]) # your track may differ ->setTrackNo(20) ->send();
示例响应
{ status:"ok", submissions:[ { id:1234567890, result:{ id:"5dfed459-fd8f-40d7-9d93-..." }, status:"imported" } ] }
如果提交处于挂起状态
{ "status":"ok", "submissions":[ { "id":123456789, "status":"pending" } ] }
批量提交指纹
您可以将多个指纹同时传递
<?php require_once '../vendor/autoload.php'; require_once './bootstrap.php'; $batch = new \AcoustId\Submission\Batch(getenv('API_APPLICATION_TOKEN')); $batch->setUserToken(getenv('API_USER_TOKEN')); $batch->setWait(5); $batch->setBatch([ (new AcoustId\Submission($batch->getClientAPIToken())) ->setFingerPrint('BDQGOCRIIpDoYgA...') ->setDuration(256), (new AcoustId\Submission($batch->getClientAPIToken())) ->setFingerPrint('AQADtEmiKEnCREl...') ->setDuration(238), ]); $result = $batch->sendBatch();
示例响应
{ status:"ok", submissions:[ { id:1234567890, index:"0", result:{ id:"5dfed459-fd8f-40d7-9d93-..." }, status:"imported" }, { id:1234567890, index:"1", result:{ id:"f786e327-453d-49b6-b313-..." }, status:"imported" } ] }
获取提交状态
在将数据提交给 AcoustId 后,您可能需要检查提交状态,尤其是在提交不能立即导入时(“挂起”状态)。因此,获取您的提交 ID 并运行
<?php require_once '../vendor/autoload.php'; require_once 'bootstrap.php'; $status = new \AcoustId\Submission\Status(getenv('API_APPLICATION_TOKEN')); $result = $status->setSubmissionId(123456789)->find(); //or $result = $status->find(123456789);
示例响应
{ status:"ok", submissions:[ { id:123456789, result:{ id:"e13393ef-7b4f-4a35-ae86-..." }, status:"imported" } ] }
通过 MBID 列出 AcoustID
您需要 MusicBrainz 录音 ID 才能进行此类请求。
<?php require_once '../vendor/autoload.php'; require_once './bootstrap.php'; $list = new \AcoustId\ListByMBId(getenv('API_APPLICATION_TOKEN')); $list->setJSONResponseType(); $result = $list->search('4e0d8649-1f89-44f3-91af-...');
示例响应
{ status:"ok", tracks:[ { id:"8dbf2f94-3e91-4501-bb47-..." }, {...}, { id:"12123b04-1bd6-4f55-9afa-..." } ] }
有关更多详细信息,请参阅 /examples 文件夹中的示例。
有关 AcoustId.org Web 服务的信息,请访问 此处
许可证
MIT 许可证(MIT)
在此,特此授予任何获得此软件及其相关文档文件(“软件”)副本的任何人(“个人”)免费处理该软件的权利,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许提供软件的个人这样做,但受以下条件约束
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
本软件按照“现状”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、适用于特定目的和版权无侵权性的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任承担责任,无论这些责任是由于合同、侵权或其他原因引起的,这些责任与软件或软件的使用或其他方面有关。