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' );
2014-02-27 01:33:40 +02:00
require_once ( 'rating.php' );
**2012-11-22**
**Added global support for publishers**
Files modified:
*base.php*
- changed class Entry,
- adding a constant ```cops:publishers``` to the icon array for the feed.
- changed class Page
- added branches to the page selector switch
- changed Page->public function InitializeContent
- added call to pull publisher count from database
- changed class PageAllBooks
- changed it so ```getCurrentOption``` is actually used...
- added page descendant class ```PageAllPublishers```
- handles pulling the publishers category from database
- added page descendant class ```PagePublisherDetail```
- handles pulling the books per publisher data from database
- changed class PageQueryResult
- added constant and switches for publisher search scope
- abstract class Base
- added constants for the publisher pages
*book.php*
- added require statement for publisher.php
- added ```SQL_BOOKS_BY_PUBLISHER``` query to retrieve books by publisher.
- changed class Book
- added query constant
- added publisher item
- added test in case no known publisher
- added publishername and url array elements for the JSON output
- added public function ```getPublisher```
- added public static function ```getBooksByPublisher``` to fire the query
- changed function getJson
- added publisher category to search
- added publishername (single) and publishertitle(plural) localization entries to i18n translation array
*index.php*
- added require statement for publisher.php
*lang/Localization_en.json
- added new localization entries for publisher labels (see below)
```
"publisher.alphabetical.many":"Alphabetical index of the {0} publishers",
"publisher.alphabetical.none":"Alphabetical index of absolutely no publisher",
"publisher.alphabetical.one":"Alphabetical index of the single publisher",
"publisher.name":"Publisher",
"publisher.title":"Publishers",
"publisherword.many":"{0} publishers",
"publisherword.none":"No publisher",
"publisherword.one":"1 publisher",
"search.result.publisher":"Search result for *{0}* in publishers",
```
*templates\bookdetail.html*
- added publisher label and item to bookdetail popup
*test\bookTest.php*
- added indices and names of publishers added to testdatabase as comment
- added test function ```testGetBooksByPublisher```
- changed test function testGetBookById to add assertion for publisher name
- changed test function testTypeaheadSearch to add search on partial publisher name.
*test\pageTest.php*
- changed test function testPageIndex to insert publisher category and adjust page indices
- changed test function testPageIndexWithCustomColum to adjust for the changed page indices
- added test function testPageAllPublishers
- added test function testPagePublishersDetail
- added test function testPageSearchScopePublishers
*test\BaseWithSomeBooks\metadata.db*
- added 5 publishers spread across all 14 books, replacing the original publisher Feedbooks
Files added:
*publisher.php*
2013-11-22 23:08:09 +02:00
require_once ( 'publisher.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
2013-12-05 11:52:51 +02:00
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
2012-12-04 16:36:10 +02:00
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-11-22**
**Added global support for publishers**
Files modified:
*base.php*
- changed class Entry,
- adding a constant ```cops:publishers``` to the icon array for the feed.
- changed class Page
- added branches to the page selector switch
- changed Page->public function InitializeContent
- added call to pull publisher count from database
- changed class PageAllBooks
- changed it so ```getCurrentOption``` is actually used...
- added page descendant class ```PageAllPublishers```
- handles pulling the publishers category from database
- added page descendant class ```PagePublisherDetail```
- handles pulling the books per publisher data from database
- changed class PageQueryResult
- added constant and switches for publisher search scope
- abstract class Base
- added constants for the publisher pages
*book.php*
- added require statement for publisher.php
- added ```SQL_BOOKS_BY_PUBLISHER``` query to retrieve books by publisher.
- changed class Book
- added query constant
- added publisher item
- added test in case no known publisher
- added publishername and url array elements for the JSON output
- added public function ```getPublisher```
- added public static function ```getBooksByPublisher``` to fire the query
- changed function getJson
- added publisher category to search
- added publishername (single) and publishertitle(plural) localization entries to i18n translation array
*index.php*
- added require statement for publisher.php
*lang/Localization_en.json
- added new localization entries for publisher labels (see below)
```
"publisher.alphabetical.many":"Alphabetical index of the {0} publishers",
"publisher.alphabetical.none":"Alphabetical index of absolutely no publisher",
"publisher.alphabetical.one":"Alphabetical index of the single publisher",
"publisher.name":"Publisher",
"publisher.title":"Publishers",
"publisherword.many":"{0} publishers",
"publisherword.none":"No publisher",
"publisherword.one":"1 publisher",
"search.result.publisher":"Search result for *{0}* in publishers",
```
*templates\bookdetail.html*
- added publisher label and item to bookdetail popup
*test\bookTest.php*
- added indices and names of publishers added to testdatabase as comment
- added test function ```testGetBooksByPublisher```
- changed test function testGetBookById to add assertion for publisher name
- changed test function testTypeaheadSearch to add search on partial publisher name.
*test\pageTest.php*
- changed test function testPageIndex to insert publisher category and adjust page indices
- changed test function testPageIndexWithCustomColum to adjust for the changed page indices
- added test function testPageAllPublishers
- added test function testPagePublishersDetail
- added test function testPageSearchScopePublishers
*test\BaseWithSomeBooks\metadata.db*
- added 5 publishers spread across all 14 books, replacing the original publisher Feedbooks
Files added:
*publisher.php*
2013-11-22 23:08:09 +02:00
define ( 'SQL_BOOKS_BY_PUBLISHER' , " select { 0} from books_publishers_link, books " . SQL_BOOKS_LEFT_JOIN . "
where books_publishers_link . book = books . id and publisher = ? { 1 } order by publisher " );
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 . "
2014-12-29 07:20:57 +02:00
left outer join books_series_link on books_series_link . book = books . id
where books_authors_link . book = books . id and author = ? { 1 } order by series desc , series_index asc , pubdate asc " );
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
2013-12-08 16:43:23 +02:00
exists ( select null from publishers , books_publishers_link where book = books . id and books_publishers_link . publisher = publishers . id and publishers . name like ? ) or
2013-09-27 18:13:31 +03:00
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 " );
2014-02-27 01:33:40 +02:00
define ( 'SQL_BOOKS_BY_RATING' , " select { 0} from books " . SQL_BOOKS_LEFT_JOIN . "
2014-03-15 22:33:51 +02:00
where books_ratings_link . book = books . id and ratings . id = ? { 1 } order by sort " );
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 " ;
2013-12-05 11:52:51 +02: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 ;
2013-11-30 17:21:52 +02:00
const SQL_BOOKS_BY_PUBLISHER = SQL_BOOKS_BY_PUBLISHER ;
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 ;
2014-02-27 01:33:40 +02:00
const SQL_BOOKS_BY_RATING = SQL_BOOKS_BY_RATING ;
2013-12-05 11:52:51 +02:00
2013-12-08 22:01:17 +02:00
const BAD_SEARCH = " QQQQQ " ;
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 ;
**2012-11-22**
**Added global support for publishers**
Files modified:
*base.php*
- changed class Entry,
- adding a constant ```cops:publishers``` to the icon array for the feed.
- changed class Page
- added branches to the page selector switch
- changed Page->public function InitializeContent
- added call to pull publisher count from database
- changed class PageAllBooks
- changed it so ```getCurrentOption``` is actually used...
- added page descendant class ```PageAllPublishers```
- handles pulling the publishers category from database
- added page descendant class ```PagePublisherDetail```
- handles pulling the books per publisher data from database
- changed class PageQueryResult
- added constant and switches for publisher search scope
- abstract class Base
- added constants for the publisher pages
*book.php*
- added require statement for publisher.php
- added ```SQL_BOOKS_BY_PUBLISHER``` query to retrieve books by publisher.
- changed class Book
- added query constant
- added publisher item
- added test in case no known publisher
- added publishername and url array elements for the JSON output
- added public function ```getPublisher```
- added public static function ```getBooksByPublisher``` to fire the query
- changed function getJson
- added publisher category to search
- added publishername (single) and publishertitle(plural) localization entries to i18n translation array
*index.php*
- added require statement for publisher.php
*lang/Localization_en.json
- added new localization entries for publisher labels (see below)
```
"publisher.alphabetical.many":"Alphabetical index of the {0} publishers",
"publisher.alphabetical.none":"Alphabetical index of absolutely no publisher",
"publisher.alphabetical.one":"Alphabetical index of the single publisher",
"publisher.name":"Publisher",
"publisher.title":"Publishers",
"publisherword.many":"{0} publishers",
"publisherword.none":"No publisher",
"publisherword.one":"1 publisher",
"search.result.publisher":"Search result for *{0}* in publishers",
```
*templates\bookdetail.html*
- added publisher label and item to bookdetail popup
*test\bookTest.php*
- added indices and names of publishers added to testdatabase as comment
- added test function ```testGetBooksByPublisher```
- changed test function testGetBookById to add assertion for publisher name
- changed test function testTypeaheadSearch to add search on partial publisher name.
*test\pageTest.php*
- changed test function testPageIndex to insert publisher category and adjust page indices
- changed test function testPageIndexWithCustomColum to adjust for the changed page indices
- added test function testPageAllPublishers
- added test function testPagePublishersDetail
- added test function testPageSearchScopePublishers
*test\BaseWithSomeBooks\metadata.db*
- added 5 publishers spread across all 14 books, replacing the original publisher Feedbooks
Files added:
*publisher.php*
2013-11-22 23:08:09 +02:00
public $publisher = NULL ;
2012-05-28 08:01:33 +03:00
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
2013-12-05 11:52:51 +02: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
}
2013-12-05 11:52:51 +02:00
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
}
2013-12-05 11:52:51 +02:00
2012-05-28 08:07:49 +03:00
public static function getEntryIdByLetter ( $startingLetter ) {
return self :: ALL_BOOKS_ID . " :letter: " . $startingLetter ;
}
2013-12-05 11:52:51 +02:00
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-12-05 11:52:51 +02:00
2014-02-13 12:07:50 +02:00
public function getDetailUrl () {
2014-01-07 10:27:02 +02:00
$urlParam = $this -> getUri ();
if ( ! is_null ( GetUrlParam ( DB ))) $urlParam = addURLParameter ( $urlParam , DB , GetUrlParam ( DB ));
return 'index.php' . $urlParam ;
}
public function getTitle () {
return $this -> title ;
}
/* Other class (author, series, tag, ...) initialization and accessors */
2013-12-05 11:52:51 +02:00
2012-05-28 08:01:33 +03:00
public function getAuthors () {
if ( is_null ( $this -> authors )) {
$this -> authors = Author :: getAuthorByBookId ( $this -> id );
}
return $this -> authors ;
}
2013-12-05 11:52:51 +02:00
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
}
2013-12-05 11:52:51 +02:00
2014-03-27 15:07:50 +02:00
public function getAuthorsSort () {
return implode ( " , " , array_map ( function ( $author ) { return $author -> sort ; }, $this -> getAuthors ()));
}
**2012-11-22**
**Added global support for publishers**
Files modified:
*base.php*
- changed class Entry,
- adding a constant ```cops:publishers``` to the icon array for the feed.
- changed class Page
- added branches to the page selector switch
- changed Page->public function InitializeContent
- added call to pull publisher count from database
- changed class PageAllBooks
- changed it so ```getCurrentOption``` is actually used...
- added page descendant class ```PageAllPublishers```
- handles pulling the publishers category from database
- added page descendant class ```PagePublisherDetail```
- handles pulling the books per publisher data from database
- changed class PageQueryResult
- added constant and switches for publisher search scope
- abstract class Base
- added constants for the publisher pages
*book.php*
- added require statement for publisher.php
- added ```SQL_BOOKS_BY_PUBLISHER``` query to retrieve books by publisher.
- changed class Book
- added query constant
- added publisher item
- added test in case no known publisher
- added publishername and url array elements for the JSON output
- added public function ```getPublisher```
- added public static function ```getBooksByPublisher``` to fire the query
- changed function getJson
- added publisher category to search
- added publishername (single) and publishertitle(plural) localization entries to i18n translation array
*index.php*
- added require statement for publisher.php
*lang/Localization_en.json
- added new localization entries for publisher labels (see below)
```
"publisher.alphabetical.many":"Alphabetical index of the {0} publishers",
"publisher.alphabetical.none":"Alphabetical index of absolutely no publisher",
"publisher.alphabetical.one":"Alphabetical index of the single publisher",
"publisher.name":"Publisher",
"publisher.title":"Publishers",
"publisherword.many":"{0} publishers",
"publisherword.none":"No publisher",
"publisherword.one":"1 publisher",
"search.result.publisher":"Search result for *{0}* in publishers",
```
*templates\bookdetail.html*
- added publisher label and item to bookdetail popup
*test\bookTest.php*
- added indices and names of publishers added to testdatabase as comment
- added test function ```testGetBooksByPublisher```
- changed test function testGetBookById to add assertion for publisher name
- changed test function testTypeaheadSearch to add search on partial publisher name.
*test\pageTest.php*
- changed test function testPageIndex to insert publisher category and adjust page indices
- changed test function testPageIndexWithCustomColum to adjust for the changed page indices
- added test function testPageAllPublishers
- added test function testPagePublishersDetail
- added test function testPageSearchScopePublishers
*test\BaseWithSomeBooks\metadata.db*
- added 5 publishers spread across all 14 books, replacing the original publisher Feedbooks
Files added:
*publisher.php*
2013-11-22 23:08:09 +02:00
public function getPublisher () {
if ( is_null ( $this -> publisher )) {
$this -> publisher = Publisher :: getPublisherByBookId ( $this -> id );
}
return $this -> publisher ;
}
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 ;
}
2013-12-05 11:52:51 +02:00
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 );
}
2013-12-05 11:52:51 +02:00
2012-05-28 08:01:33 +03:00
public function getTags () {
if ( is_null ( $this -> tags )) {
$this -> tags = array ();
2013-12-05 11:52:51 +02:00
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 ())
{
2014-06-03 23:38:23 +03:00
array_push ( $this -> tags , new Tag ( $post ));
2012-05-28 08:01:33 +03:00
}
}
return $this -> tags ;
}
2014-01-07 22:22:35 +02:00
2014-01-07 10:27:02 +02:00
public function getTagsName () {
return implode ( " , " , array_map ( function ( $tag ) { return $tag -> name ; }, $this -> getTags ()));
}
2013-12-05 11:52:51 +02:00
2012-06-26 15:27:06 +03:00
public function getDatas ()
{
if ( is_null ( $this -> datas )) {
2014-01-08 17:54:11 +02:00
$this -> datas = Data :: getDataByBook ( $this );
2012-06-26 15:27:06 +03:00
}
return $this -> datas ;
}
2013-12-05 11:52:51 +02:00
2014-01-07 10:27:02 +02:00
/* End of other class (author, series, tag, ...) initialization and accessors */
public static function getFilterString () {
$filter = getURLParam ( " tag " , NULL );
if ( empty ( $filter )) return " " ;
$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 ;
}
2013-11-30 17:21:52 +02:00
public function GetMostInterestingDataToSendToKindle ()
{
2014-09-11 19:15:23 +03:00
$bestFormatForKindle = array ( " EPUB " , " PDF " , " AZW3 " , " MOBI " );
2013-11-30 17:21:52 +02: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 ;
}
2013-12-05 11:52:51 +02:00
2012-12-23 14:42:53 +02:00
public function getDataById ( $idData )
{
2014-01-08 18:51:40 +02:00
$reduced = array_filter ( $this -> getDatas (), function ( $data ) use ( $idData ) {
return $data -> id == $idData ;
});
return reset ( $reduced );
2012-12-23 14:42:53 +02:00
}
2014-01-07 22:22:35 +02: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-12-05 11:52:51 +02:00
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 );
}
}
2013-12-05 11:52:51 +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
}
2013-12-05 11:52:51 +02:00
2012-06-26 15:45:09 +03:00
public function getDataFormat ( $format ) {
2014-01-08 18:51:40 +02:00
$reduced = array_filter ( $this -> getDatas (), function ( $data ) use ( $format ) {
return $data -> format == $format ;
});
return reset ( $reduced );
2012-06-26 15:45:09 +03:00
}
2013-12-05 11:52:51 +02:00
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
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-12-05 11:52:51 +02: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 );
2013-12-05 11:52:51 +02:00
2013-01-02 22:50:44 +02:00
try
{
$epub = new EPub ( $data -> getLocalPath ());
2013-12-05 11:52:51 +02:00
2013-01-02 22:50:44 +02:00
$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 ();
}
}
2013-12-22 19:40:03 +02:00
2013-12-15 15:23:45 +02:00
public function getThumbnail ( $width , $height , $outputfile = NULL ) {
2013-12-14 22:49:55 +02:00
if ( is_null ( $width ) && is_null ( $height )) {
return false ;
}
2013-12-22 19:40:03 +02:00
2013-12-14 22:49:55 +02:00
$file = $this -> getFilePath ( " jpg " );
// get image size
if ( $size = GetImageSize ( $file )) {
$w = $size [ 0 ];
$h = $size [ 1 ];
//set new size
if ( ! is_null ( $width )) {
$nw = $width ;
2013-12-15 15:23:45 +02:00
if ( $nw >= $w ) { return false ; }
2013-12-14 22:49:55 +02:00
$nh = ( $nw * $h ) / $w ;
} else {
$nh = $height ;
2013-12-15 15:23:45 +02:00
if ( $nh >= $h ) { return false ; }
2013-12-14 22:49:55 +02:00
$nw = ( $nh * $w ) / $h ;
}
2014-02-11 18:01:34 +02:00
} else {
return false ;
2013-12-14 22:49:55 +02:00
}
2013-12-15 15:25:57 +02:00
2013-12-14 22:49:55 +02:00
//draw the image
$src_img = imagecreatefromjpeg ( $file );
$dst_img = imagecreatetruecolor ( $nw , $nh );
imagecopyresampled ( $dst_img , $src_img , 0 , 0 , 0 , 0 , $nw , $nh , $w , $h ); //resizing the image
2013-12-15 15:23:45 +02:00
imagejpeg ( $dst_img , $outputfile , 80 );
2013-12-14 22:49:55 +02:00
imagedestroy ( $src_img );
imagedestroy ( $dst_img );
2013-12-22 19:40:03 +02:00
2013-12-14 22:49:55 +02:00
return true ;
}
2013-12-05 11:52:51 +02:00
2012-05-28 08:01:33 +03:00
public function getLinkArray ()
{
$linkArray = array ();
2013-12-05 11:52:51 +02:00
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-12-05 11:52:51 +02:00
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
}
2013-12-05 11:52:51 +02: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
{
2013-11-30 16:36:49 +02:00
array_push ( $linkArray , $data -> getDataLink ( Link :: OPDS_ACQUISITION_TYPE , $data -> format ));
2012-05-28 08:01:33 +03:00
}
}
2013-12-05 11:52:51 +02: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
}
2013-12-05 11:52:51 +02:00
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
}
2013-12-05 11:52:51 +02:00
2012-05-28 08:01:33 +03:00
return $linkArray ;
}
2013-12-05 11:52:51 +02:00
public function getEntry () {
return new EntryBook ( $this -> getTitle (), $this -> getEntryId (),
$this -> getComment (), " text/html " ,
2012-05-28 08:05:05 +03:00
$this -> getLinkArray (), $this );
2012-05-28 08:01:33 +03:00
}
2013-12-05 11:52:51 +02:00
2013-05-23 19:55:45 +03:00
public static function getBookCount ( $database = NULL ) {
2014-05-28 17:13:57 +03:00
return parent :: executeQuerySingle ( 'select count(*) from books' , $database );
2013-05-23 19:55:45 +03:00
}
2012-05-28 08:01:33 +03:00
public static function getCount () {
2012-05-28 08:05:05 +03:00
global $config ;
2014-05-28 17:13:57 +03:00
$nBooks = parent :: executeQuerySingle ( 'select count(*) from books' );
2012-05-28 08:05:05 +03:00
$result = array ();
2013-12-05 11:52:51 +02:00
$entry = new Entry ( localize ( " allbooks.title " ),
self :: ALL_BOOKS_ID ,
str_format ( localize ( " allbooks.alphabetical " , $nBooks ), $nBooks ), " text " ,
2014-05-30 16:00:46 +03:00
array ( new LinkNavigation ( " ?page= " . parent :: PAGE_ALL_BOOKS )), " " , $nBooks );
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 ) {
2013-12-05 11:52:51 +02:00
$entry = new Entry ( localize ( " recent.title " ),
self :: ALL_RECENT_BOOKS_ID ,
str_format ( localize ( " recent.list " ), $config [ 'cops_recentbooks_limit' ]), " text " ,
2014-05-30 16:00:46 +03:00
array ( new LinkNavigation ( " ?page= " . parent :: PAGE_ALL_RECENT_BOOKS )), " " , $config [ 'cops_recentbooks_limit' ]);
2013-09-13 10:54:19 +03:00
a rray_push ( $result , $entry );
}
2012-05-28 08:05:05 +03:00
return $result ;
2012-05-28 08:01:33 +03:00
}
2013-12-05 11:52:51 +02: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
}
2014-02-27 01:33:40 +02:00
public static function getBooksByRating ( $ratingId , $n ) {
return self :: getEntryArray ( self :: SQL_BOOKS_BY_RATING , array ( $ratingId ), $n );
2014-03-15 22:33:51 +02:00
}
**2012-11-22**
**Added global support for publishers**
Files modified:
*base.php*
- changed class Entry,
- adding a constant ```cops:publishers``` to the icon array for the feed.
- changed class Page
- added branches to the page selector switch
- changed Page->public function InitializeContent
- added call to pull publisher count from database
- changed class PageAllBooks
- changed it so ```getCurrentOption``` is actually used...
- added page descendant class ```PageAllPublishers```
- handles pulling the publishers category from database
- added page descendant class ```PagePublisherDetail```
- handles pulling the books per publisher data from database
- changed class PageQueryResult
- added constant and switches for publisher search scope
- abstract class Base
- added constants for the publisher pages
*book.php*
- added require statement for publisher.php
- added ```SQL_BOOKS_BY_PUBLISHER``` query to retrieve books by publisher.
- changed class Book
- added query constant
- added publisher item
- added test in case no known publisher
- added publishername and url array elements for the JSON output
- added public function ```getPublisher```
- added public static function ```getBooksByPublisher``` to fire the query
- changed function getJson
- added publisher category to search
- added publishername (single) and publishertitle(plural) localization entries to i18n translation array
*index.php*
- added require statement for publisher.php
*lang/Localization_en.json
- added new localization entries for publisher labels (see below)
```
"publisher.alphabetical.many":"Alphabetical index of the {0} publishers",
"publisher.alphabetical.none":"Alphabetical index of absolutely no publisher",
"publisher.alphabetical.one":"Alphabetical index of the single publisher",
"publisher.name":"Publisher",
"publisher.title":"Publishers",
"publisherword.many":"{0} publishers",
"publisherword.none":"No publisher",
"publisherword.one":"1 publisher",
"search.result.publisher":"Search result for *{0}* in publishers",
```
*templates\bookdetail.html*
- added publisher label and item to bookdetail popup
*test\bookTest.php*
- added indices and names of publishers added to testdatabase as comment
- added test function ```testGetBooksByPublisher```
- changed test function testGetBookById to add assertion for publisher name
- changed test function testTypeaheadSearch to add search on partial publisher name.
*test\pageTest.php*
- changed test function testPageIndex to insert publisher category and adjust page indices
- changed test function testPageIndexWithCustomColum to adjust for the changed page indices
- added test function testPageAllPublishers
- added test function testPagePublishersDetail
- added test function testPageSearchScopePublishers
*test\BaseWithSomeBooks\metadata.db*
- added 5 publishers spread across all 14 books, replacing the original publisher Feedbooks
Files added:
*publisher.php*
2013-11-22 23:08:09 +02:00
public static function getBooksByPublisher ( $publisherId , $n ) {
return self :: getEntryArray ( self :: SQL_BOOKS_BY_PUBLISHER , array ( $publisherId ), $n );
}
2013-12-05 11:52:51 +02: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
}
2013-12-05 11:52:51 +02: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-12-05 11:52:51 +02: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 );
}
2013-12-05 11:52:51 +02:00
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 ;
}
2013-12-05 11:52:51 +02:00
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-12-05 11:52:51 +02:00
2013-12-07 22:17:38 +02:00
public static function getBooksByQuery ( $query , $n , $database = NULL , $numberPerPage = NULL ) {
2013-12-08 22:01:17 +02:00
$i = 0 ;
$critArray = array ();
2013-12-14 11:59:22 +02:00
foreach ( array ( PageQueryResult :: SCOPE_AUTHOR ,
PageQueryResult :: SCOPE_TAG ,
PageQueryResult :: SCOPE_SERIES ,
PageQueryResult :: SCOPE_PUBLISHER ,
PageQueryResult :: SCOPE_BOOK ) as $key ) {
2013-12-17 23:45:51 +02:00
if ( in_array ( $key , getCurrentOption ( 'ignored_categories' )) ||
2013-12-08 22:01:17 +02:00
( ! array_key_exists ( $key , $query ) && ! array_key_exists ( " all " , $query ))) {
$critArray [ $i ] = self :: BAD_SEARCH ;
}
else {
if ( array_key_exists ( $key , $query )) {
$critArray [ $i ] = $query [ $key ];
} else {
$critArray [ $i ] = $query [ " all " ];
}
}
$i ++ ;
}
return self :: getEntryArray ( self :: SQL_BOOKS_QUERY , $critArray , $n , $database , $numberPerPage );
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 () {
2014-05-03 18:52:08 +03:00
list (, $result ) = parent :: executeQuery ( " select { 0}
2012-05-28 08:01:33 +03:00
from books
group by substr ( upper ( sort ), 1 , 1 )
2014-05-03 18:52:08 +03:00
order by substr ( upper ( sort ), 1 , 1 ) " , " substr ( upper ( sort ), 1 , 1 ) as title , count ( * ) as count " , self::getFilterString (), array (), -1);
2012-05-28 08:05:05 +03:00
$entryArray = array ();
2012-05-28 08:01:33 +03:00
while ( $post = $result -> fetchObject ())
{
2013-12-05 11:52:51 +02:00
array_push ( $entryArray , new Entry ( $post -> title , Book :: getEntryIdByLetter ( $post -> title ),
str_format ( localize ( " bookword " , $post -> count ), $post -> count ), " text " ,
2014-06-03 22:40:45 +03:00
array ( new LinkNavigation ( " ?page= " . parent :: PAGE_ALL_BOOKS_LETTER . " &id= " . rawurlencode ( $post -> title ))), " " , $post -> count ));
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-12-05 11:52:51 +02: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-12-05 11:52:51 +02: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
}
2013-12-05 11:52:51 +02:00
2012-05-28 08:01:33 +03:00
public static function getAllRecentBooks () {
global $config ;
2014-03-10 18:59:57 +02:00
list ( $entryArray , ) = self :: getEntryArray ( self :: SQL_BOOKS_RECENT . $config [ 'cops_recentbooks_limit' ], array (), - 1 );
2012-05-28 08:05:05 +03:00
return $entryArray ;
2012-05-28 08:01:33 +03:00
}
}