forked from GithubBackups/tinyib
add JSON support
This commit is contained in:
parent
b8603b717f
commit
d6841c02aa
2
LICENSE
2
LICENSE
@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2019 Trevor Slocum <trevor@rocketnine.space>
|
Copyright (c) 2020 Trevor Slocum <trevor@rocketnine.space>
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
31
imgboard.php
31
imgboard.php
@ -1,7 +1,29 @@
|
|||||||
<?php
|
<?php
|
||||||
# TinyIB
|
/*
|
||||||
#
|
TinyIB <https://gitlab.com/tslocum/tinyib>
|
||||||
# https://gitlab.com/tslocum/tinyib
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2020 Trevor Slocum <trevor@rocketnine.space>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
error_reporting(E_ALL);
|
error_reporting(E_ALL);
|
||||||
ini_set("display_errors", 1);
|
ini_set("display_errors", 1);
|
||||||
@ -57,6 +79,9 @@ foreach ($writedirs as $dir) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$includes = array("inc/defines.php", "inc/functions.php", "inc/html.php");
|
$includes = array("inc/defines.php", "inc/functions.php", "inc/html.php");
|
||||||
|
if (TINYIB_JSON) {
|
||||||
|
$includes[] = 'inc/json.php';
|
||||||
|
}
|
||||||
if (in_array(TINYIB_DBMODE, array('flatfile', 'mysql', 'mysqli', 'sqlite', 'sqlite3', 'pdo'))) {
|
if (in_array(TINYIB_DBMODE, array('flatfile', 'mysql', 'mysqli', 'sqlite', 'sqlite3', 'pdo'))) {
|
||||||
$includes[] = 'inc/database_' . TINYIB_DBMODE . '.php';
|
$includes[] = 'inc/database_' . TINYIB_DBMODE . '.php';
|
||||||
} else {
|
} else {
|
||||||
|
@ -184,6 +184,17 @@ function postsInThreadByID($id, $moderated_only = true) {
|
|||||||
return convertPostsToSQLStyle($rows);
|
return convertPostsToSQLStyle($rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function imagesInThreadByID($id, $moderated_only = true) {
|
||||||
|
$images = 0;
|
||||||
|
$posts = postsInThreadByID($id, false);
|
||||||
|
foreach ($posts as $post) {
|
||||||
|
if ($post['file'] != '') {
|
||||||
|
$images++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $images;
|
||||||
|
}
|
||||||
|
|
||||||
function postsByHex($hex) {
|
function postsByHex($hex) {
|
||||||
$rows = $GLOBALS['db']->selectWhere(POSTS_FILE, new SimpleWhereClause(POST_FILE_HEX, '=', $hex, STRING_COMPARISON), 1);
|
$rows = $GLOBALS['db']->selectWhere(POSTS_FILE, new SimpleWhereClause(POST_FILE_HEX, '=', $hex, STRING_COMPARISON), 1);
|
||||||
return convertPostsToSQLStyle($rows);
|
return convertPostsToSQLStyle($rows);
|
||||||
|
@ -105,6 +105,17 @@ function postsInThreadByID($id, $moderated_only = true) {
|
|||||||
return $posts;
|
return $posts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function imagesInThreadByID($id, $moderated_only = true) {
|
||||||
|
$images = 0;
|
||||||
|
$posts = postsInThreadByID($id, false);
|
||||||
|
foreach ($posts as $post) {
|
||||||
|
if ($post['file'] != '') {
|
||||||
|
$images++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $images;
|
||||||
|
}
|
||||||
|
|
||||||
function postsByHex($hex) {
|
function postsByHex($hex) {
|
||||||
$posts = array();
|
$posts = array();
|
||||||
$result = mysql_query("SELECT `id`, `parent` FROM `" . TINYIB_DBPOSTS . "` WHERE `file_hex` = '" . mysql_real_escape_string($hex) . "' AND `moderated` = 1 LIMIT 1");
|
$result = mysql_query("SELECT `id`, `parent` FROM `" . TINYIB_DBPOSTS . "` WHERE `file_hex` = '" . mysql_real_escape_string($hex) . "' AND `moderated` = 1 LIMIT 1");
|
||||||
|
@ -117,6 +117,17 @@ function postsInThreadByID($id, $moderated_only = true) {
|
|||||||
return $posts;
|
return $posts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function imagesInThreadByID($id, $moderated_only = true) {
|
||||||
|
$images = 0;
|
||||||
|
$posts = postsInThreadByID($id, false);
|
||||||
|
foreach ($posts as $post) {
|
||||||
|
if ($post['file'] != '') {
|
||||||
|
$images++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $images;
|
||||||
|
}
|
||||||
|
|
||||||
function postsByHex($hex) {
|
function postsByHex($hex) {
|
||||||
global $link;
|
global $link;
|
||||||
$posts = array();
|
$posts = array();
|
||||||
|
@ -167,6 +167,17 @@ function postsInThreadByID($id, $moderated_only = true) {
|
|||||||
return $posts;
|
return $posts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function imagesInThreadByID($id, $moderated_only = true) {
|
||||||
|
$images = 0;
|
||||||
|
$posts = postsInThreadByID($id, false);
|
||||||
|
foreach ($posts as $post) {
|
||||||
|
if ($post['file'] != '') {
|
||||||
|
$images++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $images;
|
||||||
|
}
|
||||||
|
|
||||||
function postsByHex($hex) {
|
function postsByHex($hex) {
|
||||||
$posts = array();
|
$posts = array();
|
||||||
$results = pdoQuery("SELECT * FROM " . TINYIB_DBPOSTS . " WHERE file_hex = ? AND moderated = 1 LIMIT 1", array($hex));
|
$results = pdoQuery("SELECT * FROM " . TINYIB_DBPOSTS . " WHERE file_hex = ? AND moderated = 1 LIMIT 1", array($hex));
|
||||||
|
@ -118,6 +118,17 @@ function postsInThreadByID($id, $moderated_only = true) {
|
|||||||
return $posts;
|
return $posts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function imagesInThreadByID($id, $moderated_only = true) {
|
||||||
|
$images = 0;
|
||||||
|
$posts = postsInThreadByID($id, false);
|
||||||
|
foreach ($posts as $post) {
|
||||||
|
if ($post['file'] != '') {
|
||||||
|
$images++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $images;
|
||||||
|
}
|
||||||
|
|
||||||
function postsByHex($hex) {
|
function postsByHex($hex) {
|
||||||
$posts = array();
|
$posts = array();
|
||||||
$result = sqlite_fetch_all(sqlite_query($GLOBALS["db"], "SELECT id, parent FROM " . TINYIB_DBPOSTS . " WHERE file_hex = '" . sqlite_escape_string($hex) . "' LIMIT 1"), SQLITE_ASSOC);
|
$result = sqlite_fetch_all(sqlite_query($GLOBALS["db"], "SELECT id, parent FROM " . TINYIB_DBPOSTS . " WHERE file_hex = '" . sqlite_escape_string($hex) . "' LIMIT 1"), SQLITE_ASSOC);
|
||||||
|
@ -130,6 +130,17 @@ function postsInThreadByID($id, $moderated_only = true) {
|
|||||||
return $posts;
|
return $posts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function imagesInThreadByID($id, $moderated_only = true) {
|
||||||
|
$images = 0;
|
||||||
|
$posts = postsInThreadByID($id, false);
|
||||||
|
foreach ($posts as $post) {
|
||||||
|
if ($post['file'] != '') {
|
||||||
|
$images++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $images;
|
||||||
|
}
|
||||||
|
|
||||||
function postsByHex($hex) {
|
function postsByHex($hex) {
|
||||||
global $db;
|
global $db;
|
||||||
$posts = array();
|
$posts = array();
|
||||||
|
@ -46,6 +46,9 @@ if (!defined('TINYIB_TIMEZONE')) {
|
|||||||
if (!defined('TINYIB_CATALOG')) {
|
if (!defined('TINYIB_CATALOG')) {
|
||||||
define('TINYIB_CATALOG', true);
|
define('TINYIB_CATALOG', true);
|
||||||
}
|
}
|
||||||
|
if (!defined('TINYIB_JSON')) {
|
||||||
|
define('TINYIB_JSON', true);
|
||||||
|
}
|
||||||
if (!defined('TINYIB_DBMIGRATE')) {
|
if (!defined('TINYIB_DBMIGRATE')) {
|
||||||
define('TINYIB_DBMIGRATE', false);
|
define('TINYIB_DBMIGRATE', false);
|
||||||
}
|
}
|
||||||
|
@ -623,6 +623,10 @@ function rebuildIndexes() {
|
|||||||
$i = 0;
|
$i = 0;
|
||||||
$htmlposts = '';
|
$htmlposts = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (TINYIB_JSON) {
|
||||||
|
writePage("res/" . $thread['id'] . '.json', buildThreadNoJSON($thread['id']));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($page == 0 || $htmlposts != '') {
|
if ($page == 0 || $htmlposts != '') {
|
||||||
@ -633,6 +637,11 @@ function rebuildIndexes() {
|
|||||||
if (TINYIB_CATALOG) {
|
if (TINYIB_CATALOG) {
|
||||||
rebuildCatalog();
|
rebuildCatalog();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (TINYIB_JSON) {
|
||||||
|
writePage('threads.json', buildThreadsJSON());
|
||||||
|
writePage('catalog.json', buildCatalogJSON());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function rebuildThread($id) {
|
function rebuildThread($id) {
|
||||||
|
76
inc/json.php
Normal file
76
inc/json.php
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function buildThreadsJSON() {
|
||||||
|
$output['threads'] = array();
|
||||||
|
|
||||||
|
$threads = allThreads();
|
||||||
|
//$pages may be useful later, dismiss it for now
|
||||||
|
//$pages = ceil(count($threads) / TINYIB_THREADSPERPAGE) - 1;
|
||||||
|
|
||||||
|
foreach ($threads as $thread) {
|
||||||
|
array_push($output['threads'], array('id' => $thread['id'], 'subject' => $thread['subject'], 'bumped' => $thread['bumped']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$threads_json[] = $output;
|
||||||
|
if (version_compare(phpversion(), '5.4.0', '>')) {
|
||||||
|
return json_encode($threads_json, JSON_PRETTY_PRINT);
|
||||||
|
} else {
|
||||||
|
return json_encode($threads_json);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildCatalogJSON() {
|
||||||
|
$output['threads'] = array();
|
||||||
|
|
||||||
|
$threads = allThreads();
|
||||||
|
|
||||||
|
foreach ($threads as $thread) {
|
||||||
|
$replies = postsInThreadByID($thread['id']);
|
||||||
|
$images = imagesInThreadByID($thread['id']);
|
||||||
|
|
||||||
|
if($thread['name'] == '') {
|
||||||
|
array_push($output['threads'], array('id' => $thread['id'], 'parent' => $thread['parent'], 'timestamp' => $thread['timestamp'], 'bumped' => $thread['bumped'], 'name' => 'Anonymous', 'tripcode' => $thread['tripcode'], 'subject' => $thread['subject'], 'message' => $thread['message'], 'file' => $thread['file'], 'file_hex' => $thread['file_hex'], 'file_original' => $thread['file_original'], 'file_size' => $thread['file_size'], 'file_size_formated' => $thread['file_size_formatted'], 'image_width' => $thread['image_width'], 'image_height' => $thread['image_height'], 'thumb' => $thread['thumb'], 'thumb_width' => $thread['thumb_width'], 'thumb_height' => $thread['thumb_height'], 'stickied' => $thread['stickied'], 'moderated' => $thread['moderated'], 'locked' => $thread['locked'], 'replies' => count($replies) - 1, 'images' => $images));
|
||||||
|
} else {
|
||||||
|
array_push($output['threads'], array('id' => $thread['id'], 'parent' => $thread['parent'], 'timestamp' => $thread['timestamp'], 'bumped' => $thread['bumped'], 'name' => $thread['name'], 'tripcode' => $thread['tripcode'], 'subject' => $thread['subject'], 'message' => $thread['message'], 'file' => $thread['file'], 'file_hex' => $thread['file_hex'], 'file_original' => $thread['file_original'], 'file_size' => $thread['file_size'], 'file_size_formated' => $thread['file_size_formatted'], 'image_width' => $thread['image_width'], 'image_height' => $thread['image_height'], 'thumb' => $thread['thumb'], 'thumb_width' => $thread['thumb_width'], 'thumb_height' => $thread['thumb_height'], 'stickied' => $thread['stickied'], 'moderated' => $thread['moderated'], 'locked' => $thread['locked'], 'replies' => count($replies) - 1, 'images' => $images));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$threads_json[] = $output;
|
||||||
|
if (version_compare(phpversion(), '5.4.0', '>')) {
|
||||||
|
return json_encode($threads_json, JSON_PRETTY_PRINT);
|
||||||
|
} else {
|
||||||
|
return json_encode($threads_json);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildThreadNoJSON($id) {
|
||||||
|
$output = array();
|
||||||
|
|
||||||
|
$threads = allThreads();
|
||||||
|
|
||||||
|
foreach ($threads as $thread) {
|
||||||
|
$replies = postsInThreadByID($id);
|
||||||
|
if($thread['parent'] == 0 && $thread['id'] == $id) {
|
||||||
|
if($thread['name'] == '') {
|
||||||
|
$output = array('posts' => [array('id' => $thread['id'], 'parent' => $thread['parent'], 'timestamp' => $thread['timestamp'], 'bumped' => $thread['bumped'], 'name' => 'Anonymous', 'tripcode' => $thread['tripcode'], 'subject' => $thread['subject'], 'message' => $thread['message'], 'file' => $thread['file'], 'file_hex' => $thread['file_hex'], 'file_original' => $thread['file_original'], 'file_size' => $thread['file_size'], 'file_size_formated' => $thread['file_size_formatted'], 'image_width' => $thread['image_width'], 'image_height' => $thread['image_height'], 'thumb' => $thread['thumb'], 'thumb_width' => $thread['thumb_width'], 'thumb_height' => $thread['thumb_height'], 'stickied' => $thread['stickied'], 'moderated' => $thread['moderated'], 'locked' => $thread['locked'])]);
|
||||||
|
} else {
|
||||||
|
$output = array('posts' => [array('id' => $thread['id'], 'parent' => $thread['parent'], 'timestamp' => $thread['timestamp'], 'bumped' => $thread['bumped'], 'name' => $thread['name'], 'tripcode' => $thread['tripcode'], 'subject' => $thread['subject'], 'message' => $thread['message'], 'file' => $thread['file'], 'file_hex' => $thread['file_hex'], 'file_original' => $thread['file_original'], 'file_size' => $thread['file_size'], 'file_size_formated' => $thread['file_size_formatted'], 'image_width' => $thread['image_width'], 'image_height' => $thread['image_height'], 'thumb' => $thread['thumb'], 'thumb_width' => $thread['thumb_width'], 'thumb_height' => $thread['thumb_height'], 'stickied' => $thread['stickied'], 'moderated' => $thread['moderated'], 'locked' => $thread['locked'])]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($replies as $reply) {
|
||||||
|
if($reply['parent'] == $id) {
|
||||||
|
if($thread['name'] == '') {
|
||||||
|
array_push($output['posts'], array('id' => $reply['id'], 'parent' => $reply['parent'], 'timestamp' => $reply['timestamp'], 'bumped' => $reply['bumped'], 'name' => 'Anonymous', 'tripcode' => $reply['tripcode'], 'subject' => $reply['subject'], 'message' => $reply['message'], 'file' => $reply['file'], 'file_hex' => $reply['file_hex'], 'file_original' => $reply['file_original'], 'file_size' => $reply['file_size'], 'file_size_formated' => $reply['file_size_formatted'], 'image_width' => $reply['image_width'], 'image_height' => $reply['image_height'], 'thumb' => $reply['thumb'], 'thumb_width' => $reply['thumb_width'], 'thumb_height' => $reply['thumb_height'], 'moderated' => $reply['moderated']));
|
||||||
|
} else {
|
||||||
|
array_push($output['posts'], array('id' => $reply['id'], 'parent' => $reply['parent'], 'timestamp' => $reply['timestamp'], 'bumped' => $reply['bumped'], 'name' => $reply['name'], 'tripcode' => $reply['tripcode'], 'subject' => $reply['subject'], 'message' => $reply['message'], 'file' => $reply['file'], 'file_hex' => $reply['file_hex'], 'file_original' => $reply['file_original'], 'file_size' => $reply['file_size'], 'file_size_formated' => $reply['file_size_formatted'], 'image_width' => $reply['image_width'], 'image_height' => $reply['image_height'], 'thumb' => $reply['thumb'], 'thumb_width' => $reply['thumb_width'], 'thumb_height' => $reply['thumb_height'], 'moderated' => $reply['moderated']));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (version_compare(phpversion(), '5.4.0', '>')) {
|
||||||
|
return json_encode($output, JSON_PRETTY_PRINT);
|
||||||
|
} else {
|
||||||
|
return json_encode($output);
|
||||||
|
}
|
||||||
|
}
|
@ -28,6 +28,7 @@ define('TINYIB_TRUNCATE', 15); // Messages are truncated to this many lin
|
|||||||
define('TINYIB_WORDBREAK', 80); // Words longer than this many characters will be broken apart [0 to disable]
|
define('TINYIB_WORDBREAK', 80); // Words longer than this many characters will be broken apart [0 to disable]
|
||||||
define('TINYIB_TIMEZONE', 'UTC'); // See https://secure.php.net/manual/en/timezones.php - e.g. America/Los_Angeles
|
define('TINYIB_TIMEZONE', 'UTC'); // See https://secure.php.net/manual/en/timezones.php - e.g. America/Los_Angeles
|
||||||
define('TINYIB_CATALOG', true); // Generate catalog page
|
define('TINYIB_CATALOG', true); // Generate catalog page
|
||||||
|
define('TINYIB_JSON', true); // Write JSON files (threads.json, catalog.json, etc.)
|
||||||
$tinyib_hidefieldsop = array(); // Fields to hide when creating a new thread - e.g. array('name', 'email', 'subject', 'message', 'file', 'embed', 'password')
|
$tinyib_hidefieldsop = array(); // Fields to hide when creating a new thread - e.g. array('name', 'email', 'subject', 'message', 'file', 'embed', 'password')
|
||||||
$tinyib_hidefields = array(); // Fields to hide when replying
|
$tinyib_hidefields = array(); // Fields to hide when replying
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user