diff --git a/data.sample.db b/data.sample.db index 9a92003..7e0cc5f 100644 Binary files a/data.sample.db and b/data.sample.db differ diff --git a/index.php b/index.php index 919bdf2..1f432aa 100644 --- a/index.php +++ b/index.php @@ -1,27 +1,183 @@ prepare('SELECT * FROM book WHERE category_slug = :category_slug'); + $stmt = $db->prepare('SELECT b.*, group_concat(a.name, "|") as author_name, s.id as star FROM book as b LEFT JOIN author_book as ab ON b.id = ab.book_id LEFT JOIN author AS a ON ab.author_id = a.id LEFT JOIN star AS s on s.book_id = b.id WHERE category_slug = :category_slug GROUP BY b.id '); $stmt->bindValue(':category_slug', $_GET['category'], SQLITE3_TEXT); } elseif (isset($_GET['search']) && isset($_GET['search_title']) && !empty($_GET['search_title'])) { - $stmt = $db->prepare('SELECT * FROM book WHERE title like :search'); + $stmt = $db->prepare('SELECT b.*, group_concat(a.name, "|") as author_name, s.id as star FROM book as b LEFT JOIN author_book as ab ON b.id = ab.book_id LEFT JOIN author AS a ON ab.author_id = a.id LEFT JOIN star AS s on s.book_id = b.id WHERE title like :search GROUP BY b.id '); $stmt->bindValue(':search', '%' . $_GET['search_title'] . '%', SQLITE3_TEXT); +} elseif (isset($_GET['author']) && !empty($_GET['author'])) { + $stmt = $db->prepare('SELECT b.*, group_concat(a.name, "|") as author_name, s.id as star FROM book as b LEFT JOIN author_book as ab ON b.id = ab.book_id LEFT JOIN author AS a ON ab.author_id = a.id LEFT JOIN star AS s on s.book_id = b.id WHERE a.name = :author GROUP BY b.id '); + $stmt->bindValue(':author', $_GET['author'], SQLITE3_TEXT); +} elseif (isset($_GET['book']) && !empty($_GET['book'])) { + $stmt = $db->prepare('SELECT * FROM chapter WHERE book_id = :book'); + $stmt->bindValue(':book', $_GET['book'], SQLITE3_INTEGER); + $result = $stmt->execute(); + + $chaptersArray = []; + + while ($chapter = $result->fetchArray(SQLITE3_ASSOC)) { + if (!$chapter['parent_id']) { + $chaptersArray[$chapter['id']] = ['name' => $chapter['name'], 'order' => $chapter['chapter_number'], 'subchapter' => []]; + } else { + $chaptersArray[$chapter['parent_id']]['subchapter'][$chapter['chapter_number']] = ['id' => $chapter['id'], 'name' => $chapter['name']]; + } + } + $stmt = $db->prepare('SELECT b.*, group_concat(a.name, "|") as author_name, s.id as star FROM book as b LEFT JOIN author_book as ab ON b.id = ab.book_id LEFT JOIN author AS a ON ab.author_id = a.id LEFT JOIN star AS s on s.book_id = b.id WHERE b.id = :book GROUP BY b.id '); + $stmt->bindValue(':book', $_GET['book'], SQLITE3_INTEGER); + +} elseif (isset($_GET['star']) && !empty($_GET['star'])) { + + $stmt = $db->prepare('SELECT * FROM star WHERE book_id = :book'); + $stmt->bindValue(':book', $_GET['star'], SQLITE3_INTEGER); + $result = $stmt->execute(); + if ($result->fetchArray(SQLITE3_ASSOC) === false) { + $insertStmt = $db->prepare('INSERT INTO star (book_id, user_id) VALUES (:book_id, :user_id) '); + $insertStmt->bindValue(':book_id', $_GET['star'], SQLITE3_INTEGER); + $insertStmt->bindValue(':user_id', 1, SQLITE3_INTEGER); + $insertStmt->execute(); + } else { + $stmt = $db->prepare('DELETE FROM star WHERE book_id = :book'); + $stmt->bindValue(':book', $_GET['star'], SQLITE3_INTEGER); + $result = $stmt->execute(); + } + if (isset($_SERVER['HTTP_REFERER'])) { + header('Location: ' . $_SERVER['HTTP_REFERER']); + } else { + header('Location: /'); + } } else { - $stmt = $db->prepare('SELECT * FROM book '); + $stmt = $db->prepare('SELECT b.*, group_concat(a.name, "|") as author_name, s.id as star FROM book as b LEFT JOIN author_book as ab ON b.id = ab.book_id LEFT JOIN author AS a ON ab.author_id = a.id LEFT JOIN star AS s on s.book_id = b.id GROUP BY b.id'); } $result = $stmt->execute(); +?> + + + + +Clear"; echo ''; -print(''); +print(''); while ($resultArray = $result->fetchArray(SQLITE3_ASSOC)) { + $pdfUrl = 'books/' . $resultArray['nid'] . '/' . $resultArray['nid'] . '.pdf'; $epubUrl = 'books/' . $resultArray['nid'] . '/' . $resultArray['nid'] . '.epub'; $mobiUrl = 'books/' . $resultArray['nid'] . '/' . $resultArray['nid'] . '.mobi'; @@ -30,16 +186,34 @@ while ($resultArray = $result->fetchArray(SQLITE3_ASSOC)) { $codeId = $found[0]; $codeUrl = 'books/' . $codeId . '/' . $codeId . '.zip'; } - printf('', - $resultArray['id'], $resultArray['nid'], $resultArray['url'], $resultArray['title'], $resultArray['category_slug'], $resultArray['category'], $resultArray['datepublished'], $resultArray['numberofpages'], $resultArray['reviewCount'], $resultArray['ratingValue'], + + + $authorsArray = explode('|', $resultArray['author_name']); + $authors = []; + foreach ($authorsArray as $author) { + $authors[] = '' . $author . ''; + } + printf('', + $resultArray['url'], $resultArray['nid'], $resultArray['star'] ? 'on' : 'off', $resultArray['id'], $resultArray['star'] ? '★' : '☆', $resultArray['id'], $resultArray['title'], $resultArray['category_slug'], $resultArray['category'], implode(', ', $authors), $resultArray['datepublished'], $resultArray['numberofpages'], $resultArray['reviewCount'], $resultArray['ratingValue'], is_file($pdfUrl) ? "pdf" : (strlen($resultArray['pdf']) ? 'nie pobrano' : ''), is_file($epubUrl) ? "epub" : (strlen($resultArray['epub']) ? 'nie pobrano' : ''), is_file($mobiUrl) ? "mobi" : (strlen($resultArray['mobi']) ? 'nie pobrano' : ''), is_file($codeUrl) ? "zip" : (strlen($resultArray['code']) ? 'nie pobrano' : '') ); - if ($resultArray) { - $x = $resultArray; + if (isset($chaptersArray) && $chaptersArray != []) { + $table = '
idnidTitleCategoryPublish datePagesVotesRating Pdf Epub Mobi Code
nid Title Category Author Publish date Pages Votes Rating Pdf Epub Mobi Code
%d%d%s%s%s%s%d%.1f %s%s%s%s
%d %s %s %s %s %s %s %d %.1f %s %s%s%s
'; + foreach ($chaptersArray as $chapter) { + $table .= ''; + foreach ($chapter['subchapter'] as $subchapter) { + $table .= ''; + } + } + $table .= '
' . $chapter['name'] . '
' . $subchapter['name'] . '
'; + echo $table; } +// if ($resultArray) { +// $x = $resultArray; +// } } -echo ''; +echo ''; diff --git a/packt.php b/packt.php index b36bee0..fcd492e 100644 --- a/packt.php +++ b/packt.php @@ -46,7 +46,6 @@ function c($url, $post = [], $localFilePath = null) return $server_output; } - function resolveBookUrl($bookUrl) { return 'https://www.packtpub.com/' . trim(str_replace('https://www.packtpub.com/', '', $bookUrl), '/'); @@ -96,122 +95,210 @@ function getBookInfo($bookUrl) } +function saveBookChapters($data, $bookId) +{ + $db = new SQLite3('data.db'); + print_r($data); + foreach ($data['toc'] as $chapterNumber => $chapter) { + + $stmt = $db->prepare('REPLACE INTO chapter (book_id, chapter_number, parent_id, name) + VALUES (:book_id, :chapter_number, :parent_id, :name)'); + $stmt->bindValue(':book_id', $bookId, SQLITE3_INTEGER); + $stmt->bindValue(':chapter_number', $chapterNumber + 1, SQLITE3_INTEGER); + $stmt->bindValue(':parent_id', null, SQLITE3_INTEGER); + $stmt->bindValue(':name', $chapter['title'], SQLITE3_TEXT); + $result = $stmt->execute(); + + $stmt = $db->prepare('select seq from sqlite_sequence where name="chapter"'); + $result = $stmt->execute(); + $lastInsertedId = $result->fetchArray(SQLITE3_ASSOC); + $lastInsertedId['seq']; + + if (isset($chapter['subchapters'])) { + foreach ($chapter['subchapters'] as $subChapterNumber => $subChapterName) { + + $stmt = $db->prepare('REPLACE INTO chapter (book_id, chapter_number, parent_id, name) + VALUES (:book_id, :chapter_number, :parent_id, :name)'); + $stmt->bindValue(':book_id', $bookId, SQLITE3_INTEGER); + $stmt->bindValue(':chapter_number', $subChapterNumber + 1, SQLITE3_INTEGER); + $stmt->bindValue(':parent_id', $lastInsertedId['seq'], SQLITE3_INTEGER); + $stmt->bindValue(':name', $subChapterName, SQLITE3_TEXT); + $result = $stmt->execute(); + } + } + } + +} + + +echo '
';
+
+//$data = getBookInfo('big-data-and-business-intelligence/mastering-blockchain');
+//file_put_contents('data.txt', json_encode($data));
+//die();
 $db = new SQLite3('data.db');
+//$stmt = $db->prepare('SELECT * FROM book ORDER BY random() limit 1 ');
+$stmt = $db->prepare('select * from book');
+$booksResult = $stmt->execute();
+while ($book = $booksResult->fetchArray(SQLITE3_ASSOC)) {
+    $data = getBookInfo($book['url']);
+//    saveBookChapters($data, $book['id']);
+
+//    $db = new SQLite3('data.db');
+//    print_r($data);
+    foreach ($data['toc'] as $chapterNumber => $chapter) {
+
+        $stmt = $db->prepare('REPLACE INTO chapter (book_id, chapter_number, parent_id, name)
+                                                VALUES  (:book_id, :chapter_number, :parent_id, :name)');
+        $stmt->bindValue(':book_id', $book['id'], SQLITE3_INTEGER);
+        $stmt->bindValue(':chapter_number', $chapterNumber + 1, SQLITE3_INTEGER);
+        $stmt->bindValue(':parent_id', null, SQLITE3_INTEGER);
+        $stmt->bindValue(':name', $chapter['title'], SQLITE3_TEXT);
+        $result = $stmt->execute();
+
+        $stmt = $db->prepare('select seq from sqlite_sequence where name="chapter"');
+        $result = $stmt->execute();
+        $lastInsertedId = $result->fetchArray(SQLITE3_ASSOC);
+        $lastInsertedId['seq'];
+
+        if (isset($chapter['subchapters'])) {
+            foreach ($chapter['subchapters'] as $subChapterNumber => $subChapterName) {
+
+                $stmt = $db->prepare('REPLACE INTO chapter (book_id, chapter_number, parent_id, name)
+                                                VALUES  (:book_id, :chapter_number, :parent_id, :name)');
+                $stmt->bindValue(':book_id', $book['id'], SQLITE3_INTEGER);
+                $stmt->bindValue(':chapter_number', $subChapterNumber + 1, SQLITE3_INTEGER);
+                $stmt->bindValue(':parent_id', $lastInsertedId['seq'], SQLITE3_INTEGER);
+                $stmt->bindValue(':name', $subChapterName, SQLITE3_TEXT);
+                $result = $stmt->execute();
+            }
+        }
+    }
+
+
+
+}
+
+//$data = json_decode(file_get_contents('data.txt'), 1);
+//$bookId = 1;
+
+
+//print_r($data);
+
+
+function fetchAuthorsByBooks()
+{
+    $db = new SQLite3('data.db');
 
 //$stmt = $db->prepare('SELECT * FROM book  order by random() limit 1 ');
-$stmt = $db->prepare('select * from book');
-$stmt = $db->prepare('select * from book left join author_book ON book.id = author_book.book_id where author_book.book_id is null and category is not null');
-$booksResult = $stmt->execute();
+    $stmt = $db->prepare('select * from book');
+    $booksResult = $stmt->execute();
 
 
 //$bookData = $result->fetchArray(SQLITE3_ASSOC);
-echo '
';
-while ($book = $booksResult->fetchArray(SQLITE3_ASSOC)) {
-    $bookInfo = getBookInfo($book['url']);
-
-
-    foreach ($bookInfo['authors'] as $author) {
-        $stmt = $db->prepare('SELECT * FROM  author WHERE name = :name and bio = :bio');
-        $stmt->bindValue(':name', trim($author['name']), SQLITE3_TEXT);
-        $stmt->bindValue(':bio', $author['bio'], SQLITE3_TEXT);
-        $result = $stmt->execute();
-        $authorData = $result->fetchArray(SQLITE3_ASSOC);
-
-        if (!$authorData) {
-            $stmt = $db->prepare('INSERT INTO author(name, bio) VALUES  (:name, :bio)');
+    while ($book = $booksResult->fetchArray(SQLITE3_ASSOC)) {
+        $bookInfo = getBookInfo($book['url']);
+        foreach ($bookInfo['authors'] as $author) {
+            $stmt = $db->prepare('SELECT * FROM  author WHERE name = :name and bio = :bio');
             $stmt->bindValue(':name', trim($author['name']), SQLITE3_TEXT);
             $stmt->bindValue(':bio', $author['bio'], SQLITE3_TEXT);
             $result = $stmt->execute();
+            $authorData = $result->fetchArray(SQLITE3_ASSOC);
 
-            $stmt = $db->prepare('select seq from sqlite_sequence where name="author"');
-            $result = $stmt->execute();
-            $seqData = $result->fetchArray(SQLITE3_ASSOC);
+            if (!$authorData) {
+                $stmt = $db->prepare('INSERT INTO author(name, bio) VALUES  (:name, :bio)');
+                $stmt->bindValue(':name', trim($author['name']), SQLITE3_TEXT);
+                $stmt->bindValue(':bio', $author['bio'], SQLITE3_TEXT);
+                $result = $stmt->execute();
 
-            $stmt = $db->prepare('INSERT INTO  author_book(author_id, book_id) VALUES  (:author_id, :book_id)');
-            $stmt->bindValue(':author_id', $seqData['seq'], SQLITE3_INTEGER);
-            $stmt->bindValue(':book_id', $book['id'], SQLITE3_INTEGER);
-            $result = $stmt->execute();
-        } else {
-            $stmt = $db->prepare('INSERT INTO  author_book(author_id, book_id) VALUES  (:author_id, :book_id)');
-            $stmt->bindValue(':author_id', $authorData['id'], SQLITE3_INTEGER);
-            $stmt->bindValue(':book_id', $book['id'], SQLITE3_INTEGER);
-            $result = $stmt->execute();
+                $stmt = $db->prepare('select seq from sqlite_sequence where name="author"');
+                $result = $stmt->execute();
+                $seqData = $result->fetchArray(SQLITE3_ASSOC);
+
+                $stmt = $db->prepare('INSERT INTO  author_book(author_id, book_id) VALUES  (:author_id, :book_id)');
+                $stmt->bindValue(':author_id', $seqData['seq'], SQLITE3_INTEGER);
+                $stmt->bindValue(':book_id', $book['id'], SQLITE3_INTEGER);
+                $result = $stmt->execute();
+            } else {
+                $stmt = $db->prepare('INSERT INTO  author_book(author_id, book_id) VALUES  (:author_id, :book_id)');
+                $stmt->bindValue(':author_id', $authorData['id'], SQLITE3_INTEGER);
+                $stmt->bindValue(':book_id', $book['id'], SQLITE3_INTEGER);
+                $result = $stmt->execute();
+            }
         }
-
-        var_dump($authorData);
-
     }
+
 }
 
-//print_r($bookData);
-//print_r($bookInfo);
+function downloadBooks()
+{
 
-
-$return = c('https://www.packtpub.com/', $loginData);
-$return = c('https://www.packtpub.com/account/my-ebooks');
-$document = new Document($return);
+    global $loginData;
+    $return = c('https://www.packtpub.com/', $loginData);
+    $return = c('https://www.packtpub.com/account/my-ebooks');
+    $document = new Document($return);
 //
 //$document = new Document('packt.html', true);
 
-$booksData = [];
-$books = $document->find('.product-line.unseen');
+    $booksData = [];
+    $books = $document->find('.product-line.unseen');
 
-$dl = 0;
-$db = new SQLite3('data.db');
+    $dl = 0;
+    $db = new SQLite3('data.db');
 //shuffle($books);
-foreach ($books as $book) {
+    foreach ($books as $book) {
 
-    $bookData = [];
-    $bookData['title'] = str_replace(["\r\n"], '', trim($book->first('.title::text')));
-    $bookData['nid'] = (int)$book->attr('nid');
+        $bookData = [];
+        $bookData['title'] = str_replace(["\r\n"], '', trim($book->first('.title::text')));
+        $bookData['nid'] = (int)$book->attr('nid');
 
-    $bookData['pdf'] = truncateBookUrl($book->first('a[href$=pdf]::attr(href)'));
-    $bookData['epub'] = truncateBookUrl($book->first('a[href$=epub]::attr(href)'));
-    $bookData['mobi'] = truncateBookUrl($book->first('a[href$=mobi]::attr(href)'));
-    $bookData['code'] = truncateBookUrl($book->first('a[href*=code_download]::attr(href)'));
-    $bookData['isbn'] = $book->first('div[isbn]::attr(isbn)');
-    $bookData['img'] = $book->first('img[class*=imagecache]::attr(src)');
-    $bookData['url'] = truncateBookUrl($book->first('div[class*=product-thumbnail]')->first('a::attr(href)'));
+        $bookData['pdf'] = truncateBookUrl($book->first('a[href$=pdf]::attr(href)'));
+        $bookData['epub'] = truncateBookUrl($book->first('a[href$=epub]::attr(href)'));
+        $bookData['mobi'] = truncateBookUrl($book->first('a[href$=mobi]::attr(href)'));
+        $bookData['code'] = truncateBookUrl($book->first('a[href*=code_download]::attr(href)'));
+        $bookData['isbn'] = $book->first('div[isbn]::attr(isbn)');
+        $bookData['img'] = $book->first('img[class*=imagecache]::attr(src)');
+        $bookData['url'] = truncateBookUrl($book->first('div[class*=product-thumbnail]')->first('a::attr(href)'));
 
 
-    $stmt = $db->prepare('SELECT id FROM book WHERE nid = :nid');
-    $stmt->bindValue(':nid', $bookData['nid'], SQLITE3_INTEGER);
-    $result = $stmt->execute();
-
-    $resultData = $result->fetchArray(SQLITE3_ASSOC);
-
-    $dl += downloadBook($bookData['pdf']);
-    $dl += downloadBook($bookData['epub']);
-    $dl += downloadBook($bookData['mobi']);
-    $dl += downloadBook($bookData['code']);
-
-
-    if (!$resultData) {
-        $bookData['info'] = getBookInfo($bookData['url']);
-        $stmt = $db->prepare('REPLACE INTO book (nid, title, isbn, img, url, datepublished, numberofpages, reviewCount, ratingValue, category, pdf, epub, mobi, code)
-VALUES  (:nid, :title, :isbn, :img, :url, :datepublished, :numberofpages, :reviewCount, :ratingValue, :category, :pdf, :epub, :mobi, :code)');
+        $stmt = $db->prepare('SELECT id FROM book WHERE nid = :nid');
         $stmt->bindValue(':nid', $bookData['nid'], SQLITE3_INTEGER);
-        $stmt->bindValue(':title', $bookData['title'], SQLITE3_TEXT);
-        $stmt->bindValue(':isbn', $bookData['isbn'], SQLITE3_TEXT);
-        $stmt->bindValue(':img', $bookData['img'], SQLITE3_TEXT);
-        $stmt->bindValue(':url', $bookData['url'], SQLITE3_TEXT);
-        $stmt->bindValue(':datepublished', $bookData['info']['datepublished'], SQLITE3_TEXT);
-        $stmt->bindValue(':numberofpages', $bookData['info']['numberofpages'], SQLITE3_INTEGER);
-        $stmt->bindValue(':reviewCount', $bookData['info']['reviewCount'], SQLITE3_INTEGER);
-        $stmt->bindValue(':ratingValue', (float)$bookData['info']['ratingValue'], SQLITE3_FLOAT);
-        $stmt->bindValue(':category', $bookData['info']['category'], SQLITE3_TEXT);
-        $stmt->bindValue(':pdf', $bookData['pdf'], SQLITE3_TEXT);
-        $stmt->bindValue(':epub', $bookData['epub'], SQLITE3_TEXT);
-        $stmt->bindValue(':mobi', $bookData['mobi'], SQLITE3_TEXT);
-        $stmt->bindValue(':code', $bookData['code'], SQLITE3_TEXT);
         $result = $stmt->execute();
-    }
-    echo $dl . ' - ';
-    if ($dl > 500) {
-//        var_dump($dl);
-        die();
-    }
 
+        $resultData = $result->fetchArray(SQLITE3_ASSOC);
+
+        $dl += downloadBook($bookData['pdf']);
+        $dl += downloadBook($bookData['epub']);
+        $dl += downloadBook($bookData['mobi']);
+        $dl += downloadBook($bookData['code']);
+
+
+        if (!$resultData) {
+            $bookData['info'] = getBookInfo($bookData['url']);
+            $stmt = $db->prepare('REPLACE INTO book (nid, title, isbn, img, url, datepublished, numberofpages, reviewCount, ratingValue, category, pdf, epub, mobi, code)
+VALUES  (:nid, :title, :isbn, :img, :url, :datepublished, :numberofpages, :reviewCount, :ratingValue, :category, :pdf, :epub, :mobi, :code)');
+            $stmt->bindValue(':nid', $bookData['nid'], SQLITE3_INTEGER);
+            $stmt->bindValue(':title', $bookData['title'], SQLITE3_TEXT);
+            $stmt->bindValue(':isbn', $bookData['isbn'], SQLITE3_TEXT);
+            $stmt->bindValue(':img', $bookData['img'], SQLITE3_TEXT);
+            $stmt->bindValue(':url', $bookData['url'], SQLITE3_TEXT);
+            $stmt->bindValue(':datepublished', $bookData['info']['datepublished'], SQLITE3_TEXT);
+            $stmt->bindValue(':numberofpages', $bookData['info']['numberofpages'], SQLITE3_INTEGER);
+            $stmt->bindValue(':reviewCount', $bookData['info']['reviewCount'], SQLITE3_INTEGER);
+            $stmt->bindValue(':ratingValue', (float)$bookData['info']['ratingValue'], SQLITE3_FLOAT);
+            $stmt->bindValue(':category', $bookData['info']['category'], SQLITE3_TEXT);
+            $stmt->bindValue(':pdf', $bookData['pdf'], SQLITE3_TEXT);
+            $stmt->bindValue(':epub', $bookData['epub'], SQLITE3_TEXT);
+            $stmt->bindValue(':mobi', $bookData['mobi'], SQLITE3_TEXT);
+            $stmt->bindValue(':code', $bookData['code'], SQLITE3_TEXT);
+            $result = $stmt->execute();
+        }
+        echo $dl . ' - ';
+        if ($dl > 500) {
+//        var_dump($dl);
+            die();
+        }
+    }
 }
 
 function downloadBook($url)