Extension:IPaper/code/v0.5/scribd.php
From MediaWiki.org
<?php /* Unofficial Scribd PHP Class library */ class Scribd { public $api_key; public $secret; private $url; public $session_key; public $my_user_id; private $error; public function __construct( $api_key, $secret ) { $this->api_key = $api_key; $this->secret = $secret; $this->url = 'http://api.scribd.com/api?api_key=' . $api_key; } /** * Upload a document from a file * @param $file String: relative path to file * @param $doc_type String: PDF, DOC, TXT, PPT, etc. * @param $access String: public or private. Default is Public. * @param $rev_id Integer: id of file to modify * @return array containing doc_id, access_key, and secret_password if nessesary. */ public function upload( $file, $doc_type = null, $access = null, $rev_id = null ) { $method = 'docs.upload'; $params['doc_type'] = $doc_type; $params['access'] = $access; $params['file'] = '@' . $file; $result = $this->postRequest( $method, $params ); return $result; } /** * Upload a document from a URL * @param $url String: absolute URL of file * @param $doc_type String: PDF, DOC, TXT, PPT, etc. * @param $access String: public or private. Default is Public. * @return array containing doc_id, access_key, and secret_password if nessesary. */ public function uploadFromUrl( $url, $doc_type = null, $access = null, $rev_id = null ) { $method = 'docs.uploadFromUrl'; $params['url'] = $url; $params['access'] = $access; $params['rev_id'] = $rev_id; $params['doc_type'] = $doc_type; $data_array = $this->postRequest( $method, $params ); return $data_array; } /** * Get a list of the current users files * @return array containing doc_id, title, description, access_key, and conversion_status for all documents */ public function getList() { $method = 'docs.getList'; $result = $this->postRequest( $method, array() ); return @$result['resultset']; } /** * Get the current conversion status of a document * @param $doc_id Integer: document id * @return string containing DISPLAYABLE", "DONE", "ERROR", or "PROCESSING" for the current document. */ public function getConversionStatus( $doc_id ) { $method = 'docs.getConversionStatus'; $params['doc_id'] = $doc_id; $result = $this->postRequest( $method, $params ); return $result['conversion_status']; } /** * Get settings of a document * @return array containing doc_id, title , description , access, tags, show_ads, license, access_key, secret_password */ public function getSettings( $doc_id ) { $method = 'docs.getSettings'; $params['doc_id'] = $doc_id; $result = $this->postRequest( $method, $params ); return $result; } /** * Change settings of a document * @param $doc_ids Array: document id * @param $title String: title of document * @param $description String: description of document * @param $access String: private, or public * @param $license String: "by", "by-nc", "by-nc-nd", "by-nc-sa", "by-nd", "by-sa", "c" or "pd" * @param $access String: private, or public * @param $show_ads Array: default, true, or false * @param $tags Array: list of tags * @return string containing DISPLAYABLE", "DONE", "ERROR", or "PROCESSING" for the current document. */ public function changeSettings( $doc_ids, $title = null, $description = null, $access = null, $license = null, $parental_advisory = null, $show_ads = null, $tags = null ) { $method = 'docs.changeSettings'; $params['doc_ids'] = $doc_ids; $params['title'] = $title; $params['description'] = $description; $params['access'] = $access; $params['license'] = $license; $params['show_ads'] = $show_ads; $params['tags'] = $tags; $result = $this->postRequest( $method, $params ); return $result; } /** * Delete a document * @param $doc_id Integer: document id * @return 1 on success; */ public function delete( $doc_id ) { $method = 'docs.delete'; $params['doc_id'] = $doc_id; $result = $this->postRequest( $method, $params ); return $result; } /** * Search the Scribd database * @param $query String: search query * @param $num_results Integer: number of results to return (10 default, 1000 max) * @param $num_start Integer: number to start from * @param $scope String: scope of search, "all" or "user" * @return array of results, each of which contain doc_id, secret password, access_key, title, and description */ public function search( $query, $num_results = null, $num_start = null, $scope = null ) { $method = 'docs.search'; $params['query'] = $query; $params['num_results'] = $num_results; $params['num_start'] = $num_start; $params['scope'] = $scope; $result = $this->postRequest( $method, $params ); return $result['result_set']; } /** * Login as a user * @param $username String: username of user to log in * @param $password String: password of user to log in * @return array containing session_key, name, username, and user_id of the user; */ public function login( $username, $password ) { $method = 'user.login'; $params['username'] = $username; $params['password'] = $password; $result = $this->postRequest( $method, $params ); $this->session_key = $result['session_key']; return $result; } /** * Sign up a new user * @param $username String: username of user to create * @param $password String: password of user to create * @param $email String: email address of user * @param $name String: name of user * @return array containing session_key, name, username, and user_id of the user; */ public function signup( $username, $password, $email, $name = null ) { $method = 'user.signup'; $params['username'] = $username; $params['password'] = $password; $params['name'] = $name; $params['email'] = $email; $result = $this->postRequest( $method, $params ); return $result; } private function postRequest( $method, $params ) { $params['method'] = $method; $params['session_key'] = $this->session_key; $params['my_user_id'] = $this->my_user_id; $post_params = array(); foreach ( $params as $key => &$val ) { if( !empty( $val ) ) { if ( is_array( $val ) ) { $val = implode( ',', $val ); } if( $key != 'file' && substr( $val, 0, 1 ) == '@' ) { $val = chr( 32 ) . $val; } $post_params[$key] = $val; } } $secret = $this->secret; $post_params['api_sig'] = $this->generate_sig( $params, $secret ); $request_url = $this->url; $ch = curl_init(); curl_setopt( $ch, CURLOPT_URL, $request_url ); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt( $ch, CURLOPT_POST, 1 ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $post_params ); $xml = curl_exec( $ch ); $result = simplexml_load_string( $xml ); curl_close( $ch ); if( $result['stat'] == 'fail' ) { // This is ineffecient. $error_array = (array)$result; $error_array = (array)$error_array; $error_array = (array)$error_array['error']; $error_array = $error_array['@attributes']; $this->error = $error_array['code']; throw new Exception( $error_array['message'], $error_array['code'] ); return 0; } if( $result['stat'] == 'ok' ) { // This is shifty. Works currently though. $result = $this->convert_simplexml_to_array( $result ); if( urlencode( (string)$result ) == '%0A%0A' && $this->error == 0 ) { $result = '1'; return $result; } else { return $result; } } } public static function generate_sig( $params_array, $secret ) { $str = ''; ksort( $params_array ); // Note: make sure that the signature parameter is not already included in // $params_array. foreach ( $params_array as $k => $v ) { $str .= $k . $v; } $str = $secret . $str; return md5( $str ); } public static function convert_simplexml_to_array( $sxml ) { $arr = array(); if ( $sxml ) { foreach ( $sxml as $k => $v ) { if( @$arr[$k] ) { $arr[$k . ' ' . ( count( $arr ) + 1 )] = self::convert_simplexml_to_array( $v ); } else { $arr[$k] = self::convert_simplexml_to_array( $v ); } } } if ( sizeof( $arr ) > 0 ) { return $arr; } else { return (string)$sxml; } } }
