2012-05-28 08:01:33 +03:00
< ? php
/**
* COPS ( Calibre OPDS PHP Server ) class file
*
* @ license GPL 2 ( http :// www . gnu . org / licenses / gpl . html )
* @ author S<EFBFBD> bastien Lucas < sebastien @ slucas . fr >
*/
require_once ( 'base.php' );
2012-05-28 08:05:05 +03:00
require_once ( 'serie.php' );
require_once ( 'author.php' );
2012-06-11 22:30:25 +03:00
require_once ( 'tag.php' );
2013-05-21 21:39:25 +03:00
require_once ( 'language.php' );
require_once ( " customcolumn.php " );
2012-06-26 15:27:06 +03:00
require_once ( 'data.php' );
2013-05-03 14:36:23 +03:00
require_once ( 'resources/php-epub-meta/epub.php' );
2012-05-28 08:01:33 +03:00
2012-12-04 16:36:10 +02:00
// Silly thing because PHP forbid string concatenation in class const
define ( 'SQL_BOOKS_LEFT_JOIN' , " left outer join comments on comments.book = books.id
left outer join books_ratings_link on books_ratings_link . book = books . id
left outer join ratings on books_ratings_link . rating = ratings . id " );
2013-11-08 18:53:11 +02:00
define ( 'SQL_BOOKS_ALL' , " select { 0} from books " . SQL_BOOKS_LEFT_JOIN . " order by books.sort " );
2012-12-04 16:36:10 +02:00
define ( 'SQL_BOOKS_BY_FIRST_LETTER' , " select { 0} from books " . SQL_BOOKS_LEFT_JOIN . "
2013-01-25 21:27:38 +02:00
where upper ( books . sort ) like ? order by books . sort " );
2012-12-04 16:36:10 +02:00
define ( 'SQL_BOOKS_BY_AUTHOR' , " select { 0} from books_authors_link, books " . SQL_BOOKS_LEFT_JOIN . "
2013-01-11 16:16:15 +02:00
where books_authors_link . book = books . id and author = ? { 1 } order by pubdate " );
2012-12-04 16:36:10 +02:00
define ( 'SQL_BOOKS_BY_SERIE' , " select { 0} from books_series_link, books " . SQL_BOOKS_LEFT_JOIN . "
2013-01-11 16:16:15 +02:00
where books_series_link . book = books . id and series = ? { 1 } order by series_index " );
2012-12-04 16:36:10 +02:00
define ( 'SQL_BOOKS_BY_TAG' , " select { 0} from books_tags_link, books " . SQL_BOOKS_LEFT_JOIN . "
2013-01-11 16:16:15 +02:00
where books_tags_link . book = books . id and tag = ? { 1 } order by sort " );
2013-05-21 21:39:25 +03:00
define ( 'SQL_BOOKS_BY_LANGUAGE' , " select { 0} from books_languages_link, books " . SQL_BOOKS_LEFT_JOIN . "
where books_languages_link . book = books . id and lang_code = ? { 1 } order by sort " );
2013-01-19 08:08:47 +02:00
define ( 'SQL_BOOKS_BY_CUSTOM' , " select { 0} from { 2}, books " . SQL_BOOKS_LEFT_JOIN . "
where { 2 } . book = books . id and { 2 } . { 3 } = ? { 1 } order by sort " );
2012-12-04 16:36:10 +02:00
define ( 'SQL_BOOKS_QUERY' , " select { 0} from books " . SQL_BOOKS_LEFT_JOIN . "
2013-09-27 18:13:31 +03:00
where (
exists ( select null from authors , books_authors_link where book = books . id and author = authors . id and authors . name like ? ) or
exists ( select null from tags , books_tags_link where book = books . id and tag = tags . id and tags . name like ? ) or
exists ( select null from series , books_series_link on book = books . id and books_series_link . series = series . id and series . name like ? ) or
title like ? ) { 1 } order by books . sort " );
2012-12-04 16:36:10 +02:00
define ( 'SQL_BOOKS_RECENT' , " select { 0} from books " . SQL_BOOKS_LEFT_JOIN . "
2013-01-11 16:16:15 +02:00
where 1 = 1 { 1 } order by timestamp desc limit " );
2012-12-04 16:36:10 +02:00
2012-05-28 08:01:33 +03:00
class Book extends Base {
2012-06-20 18:51:53 +03:00
const ALL_BOOKS_UUID = " urn:uuid " ;
2013-10-25 08:59:27 +03:00
const ALL_BOOKS_ID = " cops:books " ;
const ALL_RECENT_BOOKS_ID = " cops:recentbooks " ;
2012-12-04 14:13:58 +02:00
const BOOK_COLUMNS = " books.id as id, books.title as title, text as comment, path, timestamp, pubdate, series_index, uuid, has_cover, ratings.rating " ;
2012-05-28 08:01:33 +03:00
2012-12-04 16:36:10 +02:00
const SQL_BOOKS_LEFT_JOIN = SQL_BOOKS_LEFT_JOIN ;
2013-11-08 18:53:11 +02:00
const SQL_BOOKS_ALL = SQL_BOOKS_ALL ;
2012-12-04 16:36:10 +02:00
const SQL_BOOKS_BY_FIRST_LETTER = SQL_BOOKS_BY_FIRST_LETTER ;
const SQL_BOOKS_BY_AUTHOR = SQL_BOOKS_BY_AUTHOR ;
const SQL_BOOKS_BY_SERIE = SQL_BOOKS_BY_SERIE ;
const SQL_BOOKS_BY_TAG = SQL_BOOKS_BY_TAG ;
2013-05-21 21:39:25 +03:00
const SQL_BOOKS_BY_LANGUAGE = SQL_BOOKS_BY_LANGUAGE ;
2013-01-19 08:08:47 +02:00
const SQL_BOOKS_BY_CUSTOM = SQL_BOOKS_BY_CUSTOM ;
2012-12-04 16:36:10 +02:00
const SQL_BOOKS_QUERY = SQL_BOOKS_QUERY ;
const SQL_BOOKS_RECENT = SQL_BOOKS_RECENT ;
2012-09-19 19:19:41 +03:00
2012-05-28 08:01:33 +03:00
public $id ;
public $title ;
public $timestamp ;
public $pubdate ;
public $path ;
2012-06-20 18:51:53 +03:00
public $uuid ;
2012-06-23 22:14:54 +03:00
public $hasCover ;
2012-05-28 08:01:33 +03:00
public $relativePath ;
public $seriesIndex ;
public $comment ;
2012-12-04 11:58:39 +02:00
public $rating ;
2012-06-26 15:27:06 +03:00
public $datas = NULL ;
2012-05-28 08:01:33 +03:00
public $authors = NULL ;
public $serie = NULL ;
public $tags = NULL ;
2013-05-21 21:39:25 +03:00
public $languages = NULL ;
2012-05-28 08:06:12 +03:00
public $format = array ();
2012-06-26 15:27:06 +03:00
2012-05-28 08:07:49 +03:00
public function __construct ( $line ) {
$this -> id = $line -> id ;
$this -> title = $line -> title ;
$this -> timestamp = strtotime ( $line -> timestamp );
$this -> pubdate = strtotime ( $line -> pubdate );
2013-04-03 16:00:09 +03:00
$this -> path = Base :: getDbDirectory () . $line -> path ;
2012-05-28 08:07:49 +03:00
$this -> relativePath = $line -> path ;
$this -> seriesIndex = $line -> series_index ;
$this -> comment = $line -> comment ;
2012-06-20 18:51:53 +03:00
$this -> uuid = $line -> uuid ;
2012-06-23 22:14:54 +03:00
$this -> hasCover = $line -> has_cover ;
2012-12-23 14:56:01 +02:00
if ( ! file_exists ( $this -> getFilePath ( " jpg " ))) {
// double check
$this -> hasCover = 0 ;
}
2012-12-04 14:13:58 +02:00
$this -> rating = $line -> rating ;
2012-05-28 08:01:33 +03:00
}
public function getEntryId () {
2012-06-20 18:51:53 +03:00
return self :: ALL_BOOKS_UUID . " : " . $this -> uuid ;
2012-05-28 08:01:33 +03:00
}
2012-05-28 08:07:49 +03:00
public static function getEntryIdByLetter ( $startingLetter ) {
return self :: ALL_BOOKS_ID . " :letter: " . $startingLetter ;
}
2013-01-03 22:40:43 +02:00
public function getUri () {
2013-04-04 15:27:27 +03:00
return " ?page= " . parent :: PAGE_BOOK_DETAIL . " &id= $this->id " ;
2013-01-03 22:40:43 +02:00
}
2013-06-15 09:03:22 +03:00
public function getContentArray () {
global $config ;
$i = 0 ;
$preferedData = array ();
foreach ( $config [ 'cops_prefered_format' ] as $format )
{
if ( $i == 2 ) { break ; }
if ( $data = $this -> getDataFormat ( $format )) {
$i ++ ;
array_push ( $preferedData , array ( " url " => $data -> getHtmlLink (), " name " => $format ));
}
}
$serie = $this -> getSerie ();
2013-06-15 17:09:37 +03:00
if ( is_null ( $serie )) {
$sn = " " ;
$scn = " " ;
$su = " " ;
} else {
$sn = $serie -> name ;
$scn = str_format ( localize ( " content.series.data " ), $this -> seriesIndex , $serie -> name );
$link = new LinkNavigation ( $serie -> getUri ());
$su = $link -> hrefXhtml ();
}
2013-06-15 09:03:22 +03:00
2013-06-17 23:23:58 +03:00
return array ( " id " => $this -> id ,
" hasCover " => $this -> hasCover ,
2013-06-15 09:03:22 +03:00
" preferedData " => $preferedData ,
" rating " => $this -> getRating (),
" pubDate " => $this -> getPubDate (),
2013-06-15 19:54:07 +03:00
" languagesName " => $this -> getLanguages (),
2013-06-15 09:03:22 +03:00
" authorsName " => $this -> getAuthorsName (),
" tagsName " => $this -> getTagsName (),
2013-06-15 17:09:37 +03:00
" seriesName " => $sn ,
2013-07-29 15:19:20 +03:00
" seriesIndex " => $this -> seriesIndex ,
2013-06-15 17:09:37 +03:00
" seriesCompleteName " => $scn ,
" seriesurl " => $su );
}
public function getFullContentArray () {
2013-06-21 22:31:49 +03:00
global $config ;
2013-06-15 17:09:37 +03:00
$out = $this -> getContentArray ();
$out [ " coverurl " ] = Data :: getLink ( $this , " jpg " , " image/jpeg " , Link :: OPDS_IMAGE_TYPE , " cover.jpg " , NULL ) -> hrefXhtml ();
2013-07-04 23:37:27 +03:00
$out [ " thumbnailurl " ] = Data :: getLink ( $this , " jpg " , " image/jpeg " , Link :: OPDS_THUMBNAIL_TYPE , " cover.jpg " , NULL , NULL , $config [ 'cops_html_thumbnail_height' ] * 2 ) -> hrefXhtml ();
2013-06-15 19:54:07 +03:00
$out [ " content " ] = $this -> getComment ( false );
2013-06-15 17:09:37 +03:00
$out [ " datas " ] = array ();
2013-06-21 22:31:49 +03:00
$dataKindle = $this -> GetMostInterestingDataToSendToKindle ();
2013-06-15 17:09:37 +03:00
foreach ( $this -> getDatas () as $data ) {
2013-06-21 22:31:49 +03:00
$tab = array ( " id " => $data -> id , " format " => $data -> format , " url " => $data -> getHtmlLink (), " mail " => 0 );
if ( ! empty ( $config [ 'cops_mail_configuration' ]) && ! is_null ( $dataKindle ) && $data -> id == $dataKindle -> id ) {
$tab [ " mail " ] = 1 ;
}
array_push ( $out [ " datas " ], $tab );
2013-06-15 17:09:37 +03:00
}
$out [ " authors " ] = array ();
foreach ( $this -> getAuthors () as $author ) {
$link = new LinkNavigation ( $author -> getUri ());
array_push ( $out [ " authors " ], array ( " name " => $author -> name , " url " => $link -> hrefXhtml ()));
}
$out [ " tags " ] = array ();
foreach ( $this -> getTags () as $tag ) {
$link = new LinkNavigation ( $tag -> getUri ());
array_push ( $out [ " tags " ], array ( " name " => $tag -> name , " url " => $link -> hrefXhtml ()));
}
;
return $out ;
2013-06-15 09:03:22 +03:00
}
2013-04-04 15:27:27 +03:00
public function getDetailUrl ( $permalink = false ) {
$urlParam = $this -> getUri ();
if ( ! is_null ( GetUrlParam ( DB ))) $urlParam = addURLParameter ( $urlParam , DB , GetUrlParam ( DB ));
2013-06-17 22:41:59 +03:00
return 'index.php' . $urlParam ;
2013-01-03 22:40:43 +02:00
}
2012-05-28 08:01:33 +03:00
public function getTitle () {
return $this -> title ;
}
public function getAuthors () {
if ( is_null ( $this -> authors )) {
$this -> authors = Author :: getAuthorByBookId ( $this -> id );
}
return $this -> authors ;
}
2013-03-26 21:58:29 +02:00
public static function getFilterString () {
2013-01-11 16:16:15 +02:00
$filter = getURLParam ( " tag " , NULL );
2013-01-20 09:30:41 +02:00
if ( empty ( $filter )) return " " ;
2013-01-11 16:16:15 +02:00
$exists = true ;
if ( preg_match ( " /^!(.*) $ / " , $filter , $matches )) {
$exists = false ;
$filter = $matches [ 1 ];
}
$result = " exists (select null from books_tags_link, tags where books_tags_link.book = books.id and books_tags_link.tag = tags.id and tags.name = ' " . $filter . " ') " ;
if ( ! $exists ) {
$result = " not " . $result ;
}
return " and " . $result ;
}
2012-05-28 08:06:12 +03:00
public function getAuthorsName () {
2013-03-26 21:54:05 +02:00
return implode ( " , " , array_map ( function ( $author ) { return $author -> name ; }, $this -> getAuthors ()));
2012-05-28 08:06:12 +03:00
}
2012-05-28 08:01:33 +03:00
public function getSerie () {
if ( is_null ( $this -> serie )) {
$this -> serie = Serie :: getSerieByBookId ( $this -> id );
}
return $this -> serie ;
}
2012-12-03 17:05:13 +02:00
public function getLanguages () {
$lang = array ();
$result = parent :: getDb () -> prepare ( ' select languages . lang_code
from books_languages_link , languages
where books_languages_link . lang_code = languages . id
and book = ?
order by item_order ' );
$result -> execute ( array ( $this -> id ));
while ( $post = $result -> fetchObject ())
{
2013-07-29 11:10:54 +03:00
array_push ( $lang , Language :: getLanguageString ( $post -> lang_code ));
2012-12-03 17:05:13 +02:00
}
return implode ( " , " , $lang );
}
2012-05-28 08:01:33 +03:00
public function getTags () {
if ( is_null ( $this -> tags )) {
$this -> tags = array ();
2012-06-11 22:30:25 +03:00
$result = parent :: getDb () -> prepare ( ' select tags . id as id , name
2012-05-28 08:01:33 +03:00
from books_tags_link , tags
where tag = tags . id
and book = ?
order by name ' );
$result -> execute ( array ( $this -> id ));
while ( $post = $result -> fetchObject ())
{
2012-06-11 22:30:25 +03:00
array_push ( $this -> tags , new Tag ( $post -> id , $post -> name ));
2012-05-28 08:01:33 +03:00
}
}
return $this -> tags ;
}
2012-06-26 15:27:06 +03:00
public function getDatas ()
{
if ( is_null ( $this -> datas )) {
$this -> datas = array ();
$result = parent :: getDb () -> prepare ( ' select id , format , name
from data where book = ? ' );
$result -> execute ( array ( $this -> id ));
while ( $post = $result -> fetchObject ())
{
array_push ( $this -> datas , new Data ( $post , $this ));
}
}
return $this -> datas ;
}
2013-05-15 20:32:18 +03:00
public function GetMostInterestingDataToSendToKindle ()
{
2013-06-21 22:31:49 +03:00
$bestFormatForKindle = array ( " EPUB " , " PDF " , " MOBI " );
2013-05-15 20:32:18 +03:00
$bestRank = - 1 ;
$bestData = NULL ;
foreach ( $this -> getDatas () as $data ) {
$key = array_search ( $data -> format , $bestFormatForKindle );
if ( $key !== false && $key > $bestRank ) {
$bestRank = $key ;
$bestData = $data ;
}
}
return $bestData ;
}
2012-06-26 15:27:06 +03:00
2012-12-23 14:42:53 +02:00
public function getDataById ( $idData )
{
foreach ( $this -> getDatas () as $data ) {
if ( $data -> id == $idData ) {
return $data ;
}
}
return NULL ;
}
2012-05-28 08:06:12 +03:00
public function getTagsName () {
2013-03-26 21:54:05 +02:00
return implode ( " , " , array_map ( function ( $tag ) { return $tag -> name ; }, $this -> getTags ()));
2012-05-28 08:06:12 +03:00
}
2012-12-04 11:58:39 +02:00
public function getRating () {
if ( is_null ( $this -> rating ) || $this -> rating == 0 ) {
return " " ;
}
$retour = " " ;
for ( $i = 0 ; $i < $this -> rating / 2 ; $i ++ ) {
$retour .= " ★ " ;
}
for ( $i = 0 ; $i < 5 - $this -> rating / 2 ; $i ++ ) {
$retour .= " ☆ " ;
}
return $retour ;
}
2013-02-20 22:06:37 +02:00
public function getPubDate () {
2013-02-21 22:18:26 +02:00
if ( is_null ( $this -> pubdate ) || ( $this -> pubdate <= - 58979923200 )) {
2013-02-20 22:06:37 +02:00
return " " ;
}
else {
return date ( " Y " , $this -> pubdate );
}
}
2012-12-04 11:58:39 +02:00
2012-06-12 23:52:39 +03:00
public function getComment ( $withSerie = true ) {
2012-05-28 08:01:33 +03:00
$addition = " " ;
$se = $this -> getSerie ();
2012-06-12 23:52:39 +03:00
if ( ! is_null ( $se ) && $withSerie ) {
2012-06-18 18:02:05 +03:00
$addition = $addition . " <strong> " . localize ( " content.series " ) . " </strong> " . str_format ( localize ( " content.series.data " ), $this -> seriesIndex , htmlspecialchars ( $se -> name )) . " <br /> \n " ;
2012-05-28 08:01:33 +03:00
}
2013-02-21 21:59:19 +02:00
if ( preg_match ( " /< \ /(div|p|a|span)>/ " , $this -> comment ))
2012-05-30 15:41:06 +03:00
{
2013-02-19 22:50:38 +02:00
return $addition . html2xhtml ( $this -> comment );
2012-05-30 15:41:06 +03:00
}
else
{
return $addition . htmlspecialchars ( $this -> comment );
}
2012-05-28 08:01:33 +03:00
}
2012-06-26 15:45:09 +03:00
public function getDataFormat ( $format ) {
foreach ( $this -> getDatas () as $data )
{
if ( $data -> format == $format )
{
return $data ;
}
}
return NULL ;
}
2012-06-23 23:11:13 +03:00
public function getFilePath ( $extension , $idData = NULL , $relative = false )
2012-05-28 08:01:33 +03:00
{
2012-06-23 23:11:13 +03:00
$file = NULL ;
if ( $extension == " jpg " )
{
$file = " cover.jpg " ;
}
else
{
2012-12-23 14:42:53 +02:00
$data = $this -> getDataById ( $idData );
2013-07-07 11:15:49 +03:00
if ( ! $data ) return NULL ;
2012-12-23 14:42:53 +02:00
$file = $data -> name . " . " . strtolower ( $data -> format );
2012-05-28 08:01:33 +03:00
}
2012-06-23 23:11:13 +03:00
if ( $relative )
{
return $this -> relativePath . " / " . $file ;
}
else
{
return $this -> path . " / " . $file ;
}
2012-05-28 08:01:33 +03:00
}
2013-01-02 22:50:44 +02:00
public function getUpdatedEpub ( $idData )
{
2013-02-05 22:08:28 +02:00
global $config ;
2013-01-02 22:50:44 +02:00
$data = $this -> getDataById ( $idData );
try
{
$epub = new EPub ( $data -> getLocalPath ());
$epub -> Title ( $this -> title );
$authorArray = array ();
foreach ( $this -> getAuthors () as $author ) {
$authorArray [ $author -> sort ] = $author -> name ;
}
$epub -> Authors ( $authorArray );
$epub -> Language ( $this -> getLanguages ());
$epub -> Description ( $this -> getComment ( false ));
$epub -> Subjects ( $this -> getTagsName ());
2013-01-31 22:26:31 +02:00
$epub -> Cover2 ( $this -> getFilePath ( " jpg " ), " image/jpeg " );
2013-01-31 15:44:48 +02:00
$epub -> Calibre ( $this -> uuid );
2013-01-02 22:50:44 +02:00
$se = $this -> getSerie ();
if ( ! is_null ( $se )) {
$epub -> Serie ( $se -> name );
$epub -> SerieIndex ( $this -> seriesIndex );
}
2013-02-26 18:33:18 +02:00
if ( $config [ 'cops_provide_kepub' ] == " 1 " && preg_match ( " /Kobo/ " , $_SERVER [ 'HTTP_USER_AGENT' ])) {
2013-02-05 22:08:28 +02:00
$epub -> updateForKepub ();
}
2013-01-31 15:30:04 +02:00
$epub -> download ( $data -> getUpdatedFilenameEpub ());
2013-01-02 22:50:44 +02:00
}
catch ( Exception $e )
{
echo " Exception : " . $e -> getMessage ();
}
}
2012-05-28 08:01:33 +03:00
public function getLinkArray ()
{
$linkArray = array ();
2012-06-23 22:14:54 +03:00
if ( $this -> hasCover )
{
2012-06-26 15:27:06 +03:00
array_push ( $linkArray , Data :: getLink ( $this , " jpg " , " image/jpeg " , Link :: OPDS_IMAGE_TYPE , " cover.jpg " , NULL));
2013-04-03 21:59:53 +03:00
array_push ( $linkArray , Data :: getLink ( $this , " jpg " , " image/jpeg " , Link :: OPDS_THUMBNAIL_TYPE , " cover.jpg " , NULL ));
2012-06-23 22:14:54 +03:00
}
2012-06-26 15:27:06 +03:00
foreach ( $this -> getDatas () as $data )
2012-06-23 22:36:55 +03:00
{
2012-06-26 15:27:06 +03:00
if ( $data -> isKnownType ())
2012-06-23 22:36:55 +03:00
{
2012-06-26 15:27:06 +03:00
array_push ( $linkArray , $data -> getDataLink ( Link :: OPDS_ACQUISITION_TYPE , " Download " ));
2012-05-28 08:01:33 +03:00
}
}
2012-06-23 22:36:55 +03:00
2012-05-28 08:01:33 +03:00
foreach ( $this -> getAuthors () as $author ) {
2012-05-29 21:10:41 +03:00
array_push ( $linkArray , new LinkNavigation ( $author -> getUri (), " related " , str_format ( localize ( " bookentry.author " ), localize ( " splitByLetter.book.other " ), $author -> name )));
2012-05-28 08:01:33 +03:00
}
$serie = $this -> getSerie ();
if ( ! is_null ( $serie )) {
2012-05-29 21:10:41 +03:00
array_push ( $linkArray , new LinkNavigation ( $serie -> getUri (), " related " , str_format ( localize ( " content.series.data " ), $this -> seriesIndex , $serie -> name )));
2012-05-28 08:01:33 +03:00
}
return $linkArray ;
}
public function getEntry () {
2012-05-28 08:05:05 +03:00
return new EntryBook ( $this -> getTitle (), $this -> getEntryId (),
2012-05-28 08:01:33 +03:00
$this -> getComment (), " text/html " ,
2012-05-28 08:05:05 +03:00
$this -> getLinkArray (), $this );
2012-05-28 08:01:33 +03:00
}
2013-05-23 19:55:45 +03:00
public static function getBookCount ( $database = NULL ) {
$nBooks = parent :: getDb ( $database ) -> query ( 'select count(*) from books' ) -> fetchColumn ();
return $nBooks ;
}
2012-05-28 08:01:33 +03:00
public static function getCount () {
2012-05-28 08:05:05 +03:00
global $config ;
2012-05-28 08:01:33 +03:00
$nBooks = parent :: getDb () -> query ( 'select count(*) from books' ) -> fetchColumn ();
2012-05-28 08:05:05 +03:00
$result = array ();
2012-05-29 21:10:41 +03:00
$entry = new Entry ( localize ( " allbooks.title " ),
2012-05-28 08:01:33 +03:00
self :: ALL_BOOKS_ID ,
2013-04-20 16:41:32 +03:00
str_format ( localize ( " allbooks.alphabetical " , $nBooks ), $nBooks ), " text " ,
2012-05-28 08:06:12 +03:00
array ( new LinkNavigation ( " ?page= " . parent :: PAGE_ALL_BOOKS )));
2012-05-28 08:05:05 +03:00
array_push ( $result , $entry );
2013-09-13 10:54:19 +03:00
if ( $config [ 'cops_recentbooks_limit' ] > 0 ) {
$entry = new Entry ( localize ( " recent.title " ),
self :: ALL_RECENT_BOOKS_ID ,
str_format ( localize ( " recent.list " ), $config [ 'cops_recentbooks_limit' ]), " text " ,
array ( new LinkNavigation ( " ?page= " . parent :: PAGE_ALL_RECENT_BOOKS )));
array_push ( $result , $entry );
}
2012-05-28 08:05:05 +03:00
return $result ;
2012-05-28 08:01:33 +03:00
}
2012-09-20 22:15:03 +03:00
public static function getBooksByAuthor ( $authorId , $n ) {
return self :: getEntryArray ( self :: SQL_BOOKS_BY_AUTHOR , array ( $authorId ), $n );
2012-05-28 08:01:33 +03:00
}
2012-09-20 22:15:03 +03:00
public static function getBooksBySeries ( $serieId , $n ) {
return self :: getEntryArray ( self :: SQL_BOOKS_BY_SERIE , array ( $serieId ), $n );
2012-05-28 08:07:49 +03:00
}
2012-09-20 22:15:03 +03:00
public static function getBooksByTag ( $tagId , $n ) {
return self :: getEntryArray ( self :: SQL_BOOKS_BY_TAG , array ( $tagId ), $n );
2012-05-28 08:01:33 +03:00
}
2013-05-21 21:39:25 +03:00
public static function getBooksByLanguage ( $languageId , $n ) {
return self :: getEntryArray ( self :: SQL_BOOKS_BY_LANGUAGE , array ( $languageId ), $n );
}
2013-01-19 08:08:47 +02:00
public static function getBooksByCustom ( $customId , $id , $n ) {
$query = str_format ( self :: SQL_BOOKS_BY_CUSTOM , " { 0} " , " { 1} " , CustomColumn :: getTableLinkName ( $customId ), CustomColumn :: getTableLinkColumn ( $customId ));
return self :: getEntryArray ( $query , array ( $id ), $n );
}
2012-05-28 08:01:33 +03:00
public static function getBookById ( $bookId ) {
2012-05-28 08:07:49 +03:00
$result = parent :: getDb () -> prepare ( 'select ' . self :: BOOK_COLUMNS . '
2012-12-04 16:36:10 +02:00
from books ' . self::SQL_BOOKS_LEFT_JOIN . '
2012-05-28 08:01:33 +03:00
where books . id = ? ' );
$result -> execute ( array ( $bookId ));
while ( $post = $result -> fetchObject ())
{
2012-05-28 08:07:49 +03:00
$book = new Book ( $post );
2012-05-28 08:01:33 +03:00
return $book ;
}
return NULL ;
}
2012-06-24 09:16:47 +03:00
public static function getBookByDataId ( $dataId ) {
2012-12-23 14:42:53 +02:00
$result = parent :: getDb () -> prepare ( 'select ' . self :: BOOK_COLUMNS . ' , data . name , data . format
2012-12-04 16:36:10 +02:00
from data , books ' . self::SQL_BOOKS_LEFT_JOIN . '
2012-06-24 09:16:47 +03:00
where data . book = books . id and data . id = ? ' );
$result -> execute ( array ( $dataId ));
while ( $post = $result -> fetchObject ())
{
$book = new Book ( $post );
2012-12-23 14:42:53 +02:00
$data = new Data ( $post , $book );
$data -> id = $dataId ;
$book -> datas = array ( $data );
2012-06-24 09:16:47 +03:00
return $book ;
}
return NULL ;
}
2013-04-29 17:46:52 +03:00
public static function getBooksByQuery ( $query , $n , $database = NULL ) {
2013-09-27 18:13:31 +03:00
return self :: getEntryArray ( self :: SQL_BOOKS_QUERY , $query , $n , $database );
2012-05-28 08:01:33 +03:00
}
2013-11-08 18:53:11 +02:00
public static function getBooks ( $n ) {
list ( $entryArray , $totalNumber ) = self :: getEntryArray ( self :: SQL_BOOKS_ALL , array (), $n );
return array ( $entryArray , $totalNumber );
}
2012-05-28 08:01:33 +03:00
public static function getAllBooks () {
$result = parent :: getDb () -> query ( " select substr (upper (sort), 1, 1) as title, count(*) as count
from books
group by substr ( upper ( sort ), 1 , 1 )
order by substr ( upper ( sort ), 1 , 1 ) " );
2012-05-28 08:05:05 +03:00
$entryArray = array ();
2012-05-28 08:01:33 +03:00
while ( $post = $result -> fetchObject ())
{
2012-05-28 08:07:49 +03:00
array_push ( $entryArray , new Entry ( $post -> title , Book :: getEntryIdByLetter ( $post -> title ),
2013-01-05 15:33:12 +02:00
str_format ( localize ( " bookword " , $post -> count ), $post -> count ), " text " ,
2012-09-30 15:50:44 +03:00
array ( new LinkNavigation ( " ?page= " . parent :: PAGE_ALL_BOOKS_LETTER . " &id= " . rawurlencode ( $post -> title )))));
2012-05-28 08:01:33 +03:00
}
2012-05-28 08:05:05 +03:00
return $entryArray ;
2012-05-28 08:01:33 +03:00
}
2013-11-22 15:41:56 +02:00
public static function getBooksByStartingLetter ( $letter , $n , $database = NULL , $numberPerPage = NULL ) {
return self :: getEntryArray ( self :: SQL_BOOKS_BY_FIRST_LETTER , array ( $letter . " % " ), $n , $database , $numberPerPage );
2012-09-19 19:19:41 +03:00
}
2013-11-22 15:41:56 +02:00
public static function getEntryArray ( $query , $params , $n , $database = NULL , $numberPerPage = NULL ) {
list ( $totalNumber , $result ) = parent :: executeQuery ( $query , self :: BOOK_COLUMNS , self :: getFilterString (), $params , $n , $database , $numberPerPage );
2012-05-28 08:05:05 +03:00
$entryArray = array ();
2012-05-28 08:01:33 +03:00
while ( $post = $result -> fetchObject ())
{
2012-05-28 08:07:49 +03:00
$book = new Book ( $post );
2012-05-28 08:05:05 +03:00
array_push ( $entryArray , $book -> getEntry ());
2012-05-28 08:01:33 +03:00
}
2012-09-18 16:39:22 +03:00
return array ( $entryArray , $totalNumber );
2012-05-28 08:01:33 +03:00
}
public static function getAllRecentBooks () {
global $config ;
2013-11-22 16:42:50 +02:00
$entryArray = self :: getEntryArray ( self :: SQL_BOOKS_RECENT . $config [ 'cops_recentbooks_limit' ], array (), - 1 );
$entryArray = $entryArray [ 0 ];
2012-05-28 08:05:05 +03:00
return $entryArray ;
2012-05-28 08:01:33 +03:00
}
}
2013-08-20 16:50:03 +03:00
function getJson ( $complete = false ) {
global $config ;
$page = getURLParam ( " page " , Base :: PAGE_INDEX );
$query = getURLParam ( " query " );
2013-09-28 21:58:50 +03:00
$search = getURLParam ( " search " );
2013-11-22 15:41:56 +02:00
$multi = getURLParam ( " multi " );
2013-08-20 16:50:03 +03:00
$qid = getURLParam ( " id " );
$n = getURLParam ( " n " , " 1 " );
$database = GetUrlParam ( DB );
2013-09-28 21:58:50 +03:00
if ( $search ) {
$out = array ();
2013-11-22 15:41:56 +02:00
$pagequery = Base :: PAGE_OPENSEARCH_QUERY ;
2013-11-22 16:22:03 +02:00
// Special case when no databases were chosen, we search on all databases
2013-11-22 15:41:56 +02:00
if ( is_array ( $config [ 'calibre_directory' ]) && $multi === " 1 " ) {
$i = 0 ;
2013-11-22 16:22:03 +02:00
foreach ( array_keys ( $config [ 'calibre_directory' ]) as $key ) {
2013-11-22 15:41:56 +02:00
Base :: clearDb ();
array_push ( $out , array ( " title " => $key ,
" class " => " tt-header " ,
" navlink " => " index.php?db= { $i } " ));
list ( $array , $total ) = Book :: getBooksByStartingLetter ( '%' . $query , 1 , $i , 5 );
array_push ( $out , array ( " title " => str_format ( localize ( " bookword " , $total ), $total ),
" class " => " " ,
" navlink " => " index.php?page= { $pagequery } &query= { $query } &db= { $i } &scope=book " ));
$i ++ ;
}
return $out ;
}
$arrayTag = Tag :: getAllTagsByQuery ( $query , 1 , NULL , 5 );
2013-09-28 21:58:50 +03:00
$arraySeries = Serie :: getAllSeriesByQuery ( $query );
2013-11-22 15:41:56 +02:00
2013-09-28 21:58:50 +03:00
$arrayAuthor = Author :: getAuthorsByStartingLetter ( '%' . $query );
2013-11-22 15:41:56 +02:00
$arrayBook = Book :: getBooksByStartingLetter ( '%' . $query , 1 , NULL , 5 );
2013-09-28 21:58:50 +03:00
foreach ( array ( " book " => $arrayBook ,
" author " => $arrayAuthor ,
" series " => $arraySeries ,
" tag " => $arrayTag ) as $key => $array ) {
$i = 0 ;
2013-11-22 15:41:56 +02:00
if ( count ( $array ) == 2 && is_array ( $array [ 0 ])) {
$total = $array [ 1 ];
$array = $array [ 0 ];
} else {
$total = count ( $array );
}
if ( $total > 0 ) {
2013-10-13 23:00:35 +03:00
// Comment to help the perl i18n script
// str_format (localize("bookword", count($array))
// str_format (localize("authorword", count($array)
// str_format (localize("seriesword", count($array)
// str_format (localize("tagword", count($array)
2013-11-22 15:41:56 +02:00
array_push ( $out , array ( " title " => str_format ( localize ( " { $key } word " , $total ), $total ),
2013-10-13 23:00:35 +03:00
" class " => " tt-header " ,
" navlink " => " index.php?page= { $pagequery } &query= { $query } &db= { $database } &scope= { $key } " ));
}
2013-09-28 21:58:50 +03:00
foreach ( $array as $entry ) {
if ( $entry instanceof EntryBook ) {
2013-10-06 19:58:16 +03:00
array_push ( $out , array ( " class " => " " , " title " => $entry -> title , " navlink " => $entry -> book -> getDetailUrl ()));
2013-09-28 21:58:50 +03:00
} else {
2013-10-06 19:58:16 +03:00
array_push ( $out , array ( " class " => " " , " title " => $entry -> title , " navlink " => $entry -> getNavLink ()));
2013-09-28 21:58:50 +03:00
}
$i ++ ;
if ( $i > 4 ) { break ; };
}
}
return $out ;
}
2013-08-20 16:50:03 +03:00
$currentPage = Page :: getPage ( $page , $qid , $query , $n );
$currentPage -> InitializeContent ();
$out = array ( " title " => $currentPage -> title );
$entries = array ();
foreach ( $currentPage -> entryArray as $entry ) {
array_push ( $entries , $entry -> getContentArray ());
}
if ( ! is_null ( $currentPage -> book )) {
$out [ " book " ] = $currentPage -> book -> getFullContentArray ();
}
$out [ " databaseId " ] = GetUrlParam ( DB , " " );
$out [ " databaseName " ] = Base :: getDbName ();
$out [ " page " ] = $page ;
2013-11-22 15:41:56 +02:00
$out [ " multipleDatabase " ] = Base :: isMultipleDatabaseEnabled () ? 1 : 0 ;
2013-08-20 16:50:03 +03:00
$out [ " entries " ] = $entries ;
$out [ " isPaginated " ] = 0 ;
if ( $currentPage -> isPaginated ()) {
$prevLink = $currentPage -> getPrevLink ();
$nextLink = $currentPage -> getNextLink ();
$out [ " isPaginated " ] = 1 ;
$out [ " prevLink " ] = " " ;
if ( ! is_null ( $prevLink )) {
$out [ " prevLink " ] = $prevLink -> hrefXhtml ();
}
$out [ " nextLink " ] = " " ;
if ( ! is_null ( $nextLink )) {
$out [ " nextLink " ] = $nextLink -> hrefXhtml ();
}
$out [ " maxPage " ] = $currentPage -> getMaxPage ();
$out [ " currentPage " ] = $currentPage -> n ;
}
if ( ! is_null ( getURLParam ( " complete " )) || $complete ) {
2013-09-06 10:18:41 +03:00
$out [ " c " ] = array ( " version " => VERSION , " i18n " => array (
2013-08-20 16:50:03 +03:00
" coverAlt " => localize ( " i18n.coversection " ),
" authorsTitle " => localize ( " authors.title " ),
" bookwordTitle " => localize ( " bookword.title " ),
" tagsTitle " => localize ( " tags.title " ),
" seriesTitle " => localize ( " series.title " ),
" customizeTitle " => localize ( " customize.title " ),
" aboutTitle " => localize ( " about.title " ),
" previousAlt " => localize ( " paging.previous.alternate " ),
" nextAlt " => localize ( " paging.next.alternate " ),
" searchAlt " => localize ( " search.alternate " ),
" sortAlt " => localize ( " sort.alternate " ),
" homeAlt " => localize ( " home.alternate " ),
2013-09-17 17:30:19 +03:00
" cogAlt " => localize ( " cog.alternate " ),
2013-08-20 16:50:03 +03:00
" permalinkAlt " => localize ( " permalink.alternate " ),
" pubdateTitle " => localize ( " pubdate.title " ),
" languagesTitle " => localize ( " language.title " ),
" contentTitle " => localize ( " content.summary " ),
" sortorderAsc " => localize ( " search.sortorder.asc " ),
" sortorderDesc " => localize ( " search.sortorder.desc " ),
" customizeEmail " => localize ( " customize.email " )),
" url " => array (
" detailUrl " => " index.php?page=13&id= { 0}&db= { 1} " ,
" coverUrl " => " fetch.php?id= { 0}&db= { 1} " ,
" thumbnailUrl " => " fetch.php?height= " . $config [ 'cops_html_thumbnail_height' ] . " &id= { 0}&db= { 1} " ),
" config " => array (
" use_fancyapps " => $config [ " cops_use_fancyapps " ],
" max_item_per_page " => $config [ 'cops_max_item_per_page' ],
2013-09-05 09:41:40 +03:00
" server_side_rendering " => useServerSideRendering (),
2013-08-20 16:50:03 +03:00
" html_tag_filter " => $config [ 'cops_html_tag_filter' ]));
2013-08-26 22:15:54 +03:00
if ( $config [ 'cops_thumbnail_handling' ] == " 1 " ) {
2013-09-06 10:18:41 +03:00
$out [ " c " ][ " url " ][ " thumbnailUrl " ] = $out [ " c " ][ " url " ][ " coverUrl " ];
2013-08-26 22:15:54 +03:00
} else if ( ! empty ( $config [ 'cops_thumbnail_handling' ])) {
2013-09-06 10:18:41 +03:00
$out [ " c " ][ " url " ][ " thumbnailUrl " ] = $config [ 'cops_thumbnail_handling' ];
2013-08-26 22:15:54 +03:00
}
2013-08-20 16:50:03 +03:00
}
$out [ " containsBook " ] = 0 ;
if ( $currentPage -> containsBook ()) {
$out [ " containsBook " ] = 1 ;
}
$out [ " abouturl " ] = " index.php " . addURLParameter ( " ?page=16 " , DB , $database );
if ( $page == Base :: PAGE_ABOUT ) {
2013-08-27 11:02:56 +03:00
$temp = preg_replace ( " / \ <h1 \ >About COPS \ < \ /h1 \ >/ " , " <h1>About COPS " . VERSION . " </h1> " , file_get_contents ( 'about.html' ));
$out [ " fullhtml " ] = $temp ;
2013-08-20 16:50:03 +03:00
}
$out [ " homeurl " ] = " index.php " ;
if ( $page != Base :: PAGE_INDEX && ! is_null ( $database )) $out [ " homeurl " ] = $out [ " homeurl " ] . " ? " . addURLParameter ( " " , DB , $database );
return $out ;
}