summaryrefslogtreecommitdiff
path: root/inc/api.php
diff options
context:
space:
mode:
authorK <kaja47@k47.cz>2013-07-02 19:52:29 +0200
committerK <kaja47@k47.cz>2013-07-02 19:52:29 +0200
commit74a470bf4ea6c69af4a6e13af5332d6617116056 (patch)
tree80f81a6f3ffa45e331b10e151fcb9d39c9c14f1d /inc/api.php
parent9b0c31daa68c7ab96bc25e09b70ffea77ba23590 (diff)
Add support for 4chan-compatible json API.
Diffstat (limited to 'inc/api.php')
-rw-r--r--inc/api.php123
1 files changed, 123 insertions, 0 deletions
diff --git a/inc/api.php b/inc/api.php
new file mode 100644
index 00000000..5592d8af
--- /dev/null
+++ b/inc/api.php
@@ -0,0 +1,123 @@
+<?php
+
+/*
+ * Copyright (c) 2010-2013 Tinyboard Development Group
+ */
+
+/**
+ * Class for generating json API compatible with 4chan API
+ */
+class Api {
+
+ /**
+ * Translation from local fields to fields in 4chan-style API
+ */
+ public static $postFields = array(
+ 'id' => 'no',
+ 'thread' => 'resto',
+ 'subject' => 'sub',
+ 'email' => 'email',
+ 'name' => 'name',
+ 'trip' => 'trip',
+ 'capcode' => 'capcode',
+ 'body' => 'com',
+ 'time' => 'time',
+ 'thumb' => 'thumb', // non-compatible field
+ 'thumbx' => 'tn_w',
+ 'thumby' => 'tn_h',
+ 'file' => 'file', // non-compatible field
+ 'filex' => 'w',
+ 'filey' => 'h',
+ 'filesize' => 'fsize',
+ //'filename' => 'filename',
+ 'omitted' => 'omitted_posts',
+ 'omitted_images' => 'omitted_images',
+ //'posts' => 'replies',
+ //'ip' => '',
+ 'sticky' => 'sticky',
+ 'locked' => 'locked',
+ //'bumplocked' => '',
+ //'embed' => '',
+ //'root' => '',
+ //'mod' => '',
+ //'hr' => '',
+ );
+
+ static $ints = array(
+ 'no' => 1,
+ 'resto' => 1,
+ 'time' => 1,
+ 'tn_w' => 1,
+ 'tn_h' => 1,
+ 'w' => 1,
+ 'h' => 1,
+ 'fsize' => 1,
+ 'omitted_posts' => 1,
+ 'omitted_images' => 1,
+ 'sticky' => 1,
+ 'locked' => 1,
+ );
+
+ private function translatePost($post) {
+ $apiPost = array();
+ foreach (self::$postFields as $local => $translated) {
+ if (!isset($post->$local))
+ continue;
+
+ $toInt = isset(self::$ints[$translated]);
+ $val = $post->$local;
+ if ($val !== null && $val !== '') {
+ $apiPost[$translated] = $toInt ? (int) $val : $val;
+ }
+ }
+
+ if (isset($post->filename)) {
+ $dotPos = strrpos($post->filename, '.');
+ $apiPost['filename'] = substr($post->filename, 0, $dotPos);
+ $apiPost['ext'] = substr($post->filename, $dotPos);
+ }
+
+ return $apiPost;
+ }
+
+ function translateThread(Thread $thread) {
+ $apiPosts = array();
+ $op = $this->translatePost($thread);
+ $op['resto'] = 0;
+ $apiPosts['posts'][] = $op;
+
+ foreach ($thread->posts as $p) {
+ $apiPosts['posts'][] = $this->translatePost($p);
+ }
+
+ return $apiPosts;
+ }
+
+ function translatePage(array $threads) {
+ $apiPage = array();
+ foreach ($threads as $thread) {
+ $apiPage['threads'][] = $this->translateThread($thread);
+ }
+ return $apiPage;
+ }
+
+ function translateCatalogPage(array $threads) {
+ $apiPage = array();
+ foreach ($threads as $thread) {
+ $ts = $this->translateThread($thread);
+ $apiPage['threads'][] = current($ts['posts']);
+ }
+ return $apiPage;
+ }
+
+ function translateCatalog($catalog) {
+ $apiCatalog = array();
+ foreach ($catalog as $page => $threads) {
+ $apiPage = $this->translateCatalogPage($threads);
+ $apiPage['page'] = $page;
+ $apiCatalog[] = $apiPage;
+ }
+
+ return $apiCatalog;
+ }
+}