Revision: 27521
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at June 13, 2010 10:03 by minky
Initial Code
<?php
class calibre {
public $settings = array(
"server" => array(
// calibre server details
"host" => "minky.mine.nu",
"port" => "8080",
"username" => "",
"password" => "",
),
// calibre server tokens/values
"start" => 0,
"num" => 20,
"order" => "ascending",
"sort" => "title",
"search" => "",
);
// .. curl data
private $curl_meta, $curl_data;
// xml, object (simplexml) data
private $xml, $object;
// html data
private $paginate;
private $authors = array();
private $series = array();
public function __construct() {}
public function debug() {
echo "<pre>";
print_r($this);
echo "</pre>";
die;
}
private function fetch_query_string() {
$data = $this->settings;
unset($data["server"]);
return "?". http_build_query($data, "&");
}
private function parse_response() {
try {
$this->object = new SimpleXMLElement($this->curl_data);
$this->xml = $this->object->asXML();
} catch(Exception $e) {
throw new CalibreException($e->getMessage());
}
}
public function set($settings) {
if(is_array($settings)) {
foreach($settings AS $key => $value) {
if(empty($key) || empty($value)) continue;
$this->settings[$key] = $value;
}
}
return $this;
}
public function fetch_library() {
if(empty($this->settings["server"]["host"]) || empty($this->settings["server"]["port"]))
throw new CalibreException('No Server/Port Defined! <a class="button define server" href="#define">Define Server Settings</a>');
$qs = $this->fetch_query_string();
$curl = curl_init();
if(!empty($this->settings["server"]["username"]) && !empty($this->settings["server"]["password"])) {
curl_setopt($curl, CURLOPT_USERPWD, "{$this->settings["server"]["username"]}:{$this->settings["server"]["password"]}");
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
}
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_HEADER => 0,
CURLOPT_USERAGENT => "",
CURLOPT_URL => "http://{$this->settings["server"]["host"]}/library{$qs}",
CURLOPT_PORT => $this->settings["server"]["port"],
CURLOPT_TIMEOUT => 3,
));
$this->curl_data = curl_exec($curl);
$this->curl_meta = curl_getinfo($curl);
curl_close($curl);
if($this->curl_data === FALSE)
throw new CalibreException('cURL Data is empty! Is the Server running? <a class="button define server" href="#define">Define Server Settings</a>');
try {
$this->parse_response();
} catch(CalibreException $e) {
throw new CalibreException($e->getMessage());
}
return $this;
}
public function as_json() {
return json_encode($this->object);
}
public function as_object() {
return $this->object;
}
public function as_xml() {
return $this->xml;
}
private function page_select($page_count, $current = 1) {
$options = array();
for($i = 1; $i <= $page_count; $i++) {
$selected = $i == $current ? "selected" : "" ;
$options[] = '<option value="'. $i .'" '. $selected .'>'. $i .'</option>';
}
return '<select class="paginate">'. implode("", $options) .'</select>';
}
public function paginate($total) {
$page_count = ceil($total / $this->settings["num"]);
$current = ceil($this->settings["start"] / $this->settings["num"]);
$current = empty($current) ? 1 : $current ;
$prev = $current == 1 ? 1 : $current - 1 ;
$next = $current == $page_count ? $page_count : $current + 1 ;
$links = array();
$links[] = '
<section class="paginate">
<ul>
<li class="prev">
<a href="page/'. $prev .'" class="button">« Prev</a>
</li>
<li class="current">'. $this->page_select($page_count, $current) .' of '. $page_count .'</li>
<li class="next">
<a href="page/'. $next .'" class="button">Next »</a>
</li>
</ul>
</section>
';
$this->paginate = implode("", $links);
}
public function parse_html($book) {
$data = array();
foreach($book->attributes() AS $key => $value) {
if($key == "formats") {
$data[$key] = $this->parse_formats((string) $value, $data["title"], $data["id"]);
} elseif($key == "authors") {
$data[$key] = $this->parse_authors((string) $value);
} elseif($key == "series") {
$data[$key] = $this->parse_series((string) $value);
} else {
$data[$key] = (string) $value;
}
}
return $data;
}
private function parse_formats($format, $title, $id) {
$formats = stristr($format, ",") ? explode(",", $format) : array($format) ;
$output = array();
foreach($formats AS $f)
$output[] = '<a href="http://'. $this->settings["server"]["host"] .':'. $this->settings["server"]["port"] .'/get/'. strtolower($f) .'/'. $title .'_'. $id .'.'. strtolower($f) .'" class="file button">'. strtoupper($f) .'</a>';
return implode("", $output);
}
private function parse_authors($authors) {
$authors = stristr($authors, ",") ? explode(",", $authors) : array($authors) ;
$output = array();
foreach($authors AS $author)
$output[] = ucwords(trim($author));
$this->authors = array_merge($this->authors, $output);
return implode("", $output);
}
private function parse_series($series) {
return empty($series) ? "Unknown" : ucwords($series) ;
}
public function as_html() {
$books = array();
$attrib = $this->object->attributes();
$this->paginate((int) $attrib->total);
foreach($this->object->children() AS $key => $value) {
$book = $this->parse_html($value);
$this->series[] = $book["series"];
$books[] = '
<article class="book">
<header><h2>'. $book["title"] .'</h2></header>
<section class="content">
<section class="details float-left">
<ul>
<li class="author">
<span class="label">Author</span>
<span class="data">'. $book["authors"] .'</span>
</li>
<li class="author">
<span class="label">Series</span>
<span class="data">'. $book["series"] .'</span>
</li>
<li class="formats">
<span class="label">Download</span>
<span class="data">'. $book["formats"] .'</span>
</li>
</ul>
</section>
<section class="image float-right">
<img src="http://'. $this->settings["server"]["host"] .':'. $this->settings["server"]["port"] .'/get/cover/'. $book["id"] .'" alt="Cover Image" />
</section>
</section>
</article>
';
}
$paginate = $this->paginate;
return $paginate . implode("", $books) . $paginate;
}
}
class CalibreException extends Exception {
public function __construct($message, $code = 0) {
parent::__construct($message, $code);
}
}
//
$calibre = new calibre;
//
$sort = empty($_GET['sort']) ? $calibre->settings["sort"] : $_GET['sort'] ;
$order = empty($_GET['order']) ? $calibre->settings["order"] : $_GET['order'] ;
$search = empty($_GET['search']) ? "" : $_GET['search'] ;
//
$start = empty($_GET['start']) ? 0 : (int) $_GET['start'] ;
$per_page = $calibre->settings["num"];
$server = array(
"host" => $_GET['host'],
"port" => $_GET['port'],
"username" => $_GET['username'],
"password" => $_GET['password'],
);
//
$settings = array(
"start" => $start * $per_page,
"num" => $per_page,
"sort" => $sort,
"order" => $order,
"search"=> $search,
"server"=> $server,
);
// try getting library as html
try {
echo $calibre->set($settings)->fetch_library()->as_html();
} catch(CalibreException $e) {
echo '<article class="error">'. $e->getMessage() .'</article>';
}
die;
//$calibre->debug(); // very long page
?>
Initial URL
http://www.pixaweb.co.uk/calibre/
Initial Description
forms part of our Calibre Remote Web App. basically an alternate gui for calibre ebooks content-server.
Initial Title
Calibre Remote - PHP5 Class
Initial Tags
curl, php
Initial Language
PHP