1
0
Fork 0
mirror of https://github.com/Yetangitu/ampache synced 2025-10-04 10:19:25 +02:00
ampache/modules/EchoNest/Api/Sandbox.php
2013-12-28 17:11:16 +01:00

195 lines
4.8 KiB
PHP

<?php
Class SignatureCreation {
public static function oauth_hmacsha1($key, $data) {
return base64_encode(self::hmacsha1($key, $data));
}
public static function hmacsha1($key,$data) {
$blocksize=64;
$hashfunc='sha1';
if (strlen($key)>$blocksize)
$key=pack('H*', $hashfunc($key));
$key=str_pad($key,$blocksize,chr(0x00));
$ipad=str_repeat(chr(0x36),$blocksize);
$opad=str_repeat(chr(0x5c),$blocksize);
$hmac = pack(
'H*',$hashfunc(
($key^$opad).pack(
'H*',$hashfunc(
($key^$ipad).$data
)
)
)
);
return $hmac;
}
public static function oauth_signature($url,$params, $secret) {
// sort the parameters
ksort($params);
$param_string = "";
$i = 0;
foreach ($params as $k => $v) {
if ($i != 0) {
$param_string .= "&";
}
if (is_array($v)) {
$j = 0;
foreach($v as $key => $val) {
if ($j != 0) {
$param_string .= "&";
}
$param_string .= $k . "=" . $val;
$j++;
}
} else {
$param_string .= $k . "=" . $v;
}
$i++;
}
$data = "GET&".urlencode($url). "&".urlencode($param_string);
$key = $secret."&";
return self::oauth_hmacsha1($key, $data);
}
}
/**
* API calls for managing sandboxes
*
* @link http://developer.echonest.com/docs/v4/sandbox.html#overview
* @author Syd Lawrence <sydlawrence at gmail dot com>
* @license MIT License
*/
class EchoNest_Api_Sandbox extends EchoNest_Api
{
// the current sandbox key
protected $sandbox_key = "";
// the keys etc for the oauth
protected $oauth_config = array
(
"consumer_key" => "",
"consumer_secret" => "",
);
// set the current sandbox
function setSandbox($sandbox_key)
{
if ($sandbox_key)
$this->sandbox_key = $sandbox_key;
return $this;
}
// set the oauth config
function setOAuthConfig($config)
{
foreach ($this->oauth_config as $key => $val) {
if (!isset($config[$key]) || $config[$key] == "") {
// @todo make this thrown an exception
throw new Exception('Missing sandbox oauth config: '.$key);
}
$this->oauth_config[$key] = $config[$key];
}
return $this;
}
/**
* Lists assets in a sandbox.
* http://developer.echonest.com/docs/v4/sandbox.html#list
*
* @param int $start The starting index of the assets
* @param int $per_page How many assets to return per page
* @return array response object
*/
function assets($start = 0, $per_page=100)
{
// this one is simples
$response = $this->client->get('sandbox/list', array(
'sandbox' => $this->sandbox_key,
'results' => $per_page,
'start' => $start
));
$response = $this->returnResponse($response);
$total = $response['total'];
$assets = $response['assets'];
/*
leave out due to api limits
if (count($assets) < $total) {
$next = $this->assets($soFar);
$assets = array_merge($assets, $next);
}
*/
return $assets;
}
/**
* Access assets inside a sandbox.
* http://developer.echonest.com/docs/v4/sandbox.html#access
*
* @param int/array $id The id of the individual asset or an array of asset ids
* @return array response object
*/
function access($id)
{
// this is the endpoint we want this time
$endpoint = "sandbox/access";
// used for nonce and timestamp
$time = time();
// set up the parameters
$params = array(
"api_key" => $this->client->getHttpClient()->getOption('api_key'),
"id" => $id,
"oauth_nonce" => md5($time),
"oauth_timestamp" => $time,
"format" => $this->client->getHttpClient()->getOption('format'),
"oauth_signature_method" => "HMAC-SHA1",
"oauth_version" => "1.0",
"oauth_consumer_key" => $this->oauth_config['consumer_key'],
"sandbox" => $this->sandbox_key
);
// create the base url
$url = strtr($this->client->getHttpClient()->getOption('url'), array(
':api_version' => $this->client->getHttpClient()->getOption('api_version'),
':protocol' => $this->client->getHttpClient()->getOption('protocol'),
':path' => trim($endpoint, '/')
));
// generate the signature
$sig = SignatureCreation::oauth_signature($url,$params, $this->oauth_config['consumer_secret']);
// add the signature to the params
$params['oauth_signature'] = $sig;
// get the response
$response = $this->client->get($endpoint, $params);
// return the response
return $this->returnResponse($response);
}
}