From 33c0aba5b7518b4bd60ed4250658633d1f855e8b Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Wed, 31 Dec 2014 15:44:32 +0100 Subject: [PATCH 1/3] Add the file size to the photo data array --- include/Photo.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/Photo.php b/include/Photo.php index 580fd25b6a..2f7c990256 100644 --- a/include/Photo.php +++ b/include/Photo.php @@ -764,11 +764,16 @@ function get_photo_info($url) { if (is_null($data)) { $img_str = fetch_url($url, true, $redirects, 4); + $filesize = strlen($img_str); + $tempfile = tempnam(get_temppath(), "cache"); file_put_contents($tempfile, $img_str); $data = getimagesize($tempfile); unlink($tempfile); + if ($data) + $data["size"] = $filesize; + Cache::set($url, serialize($data)); } else $data = unserialize($data); From 26d5746d997f9109dffb9b8b444994c8656c247a Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Wed, 31 Dec 2014 17:01:55 +0100 Subject: [PATCH 2/3] Support for attachments in the API (for better AndStatus support) --- include/api.php | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/include/api.php b/include/api.php index bacbd65338..b879f8e427 100644 --- a/include/api.php +++ b/include/api.php @@ -886,12 +886,15 @@ 'in_reply_to_screen_name' => $in_reply_to_screen_name, 'geo' => NULL, 'favorited' => $lastwall['starred'] ? true : false, - // attachments + 'attachments' => api_get_attachments($lastwall['body']), 'user' => $user_info, 'statusnet_html' => trim(bbcode($lastwall['body'], false, false)), 'statusnet_conversation_id' => $lastwall['parent'], ); + if (!$status_info["attachments"]) + unset($status_info["attachments"]); + if ($lastwall['title'] != "") $status_info['statusnet_html'] = "

".bbcode($lastwall['title'])."

\n".$status_info['statusnet_html']; @@ -985,10 +988,14 @@ 'in_reply_to_screen_name' => $in_reply_to_screen_name, 'geo' => NULL, 'favorited' => $lastwall['starred'] ? true : false, + 'attachments' => api_get_attachments($lastwall['body']), 'statusnet_html' => trim(bbcode($lastwall['body'], false, false)), 'statusnet_conversation_id' => $lastwall['parent'], ); + if (!$user_info["attachments"]) + unset($user_info["attachments"]); + if ($lastwall['title'] != "") $user_info['statusnet_html'] = "

".bbcode($lastwall['title'])."

\n".$user_info['statusnet_html']; @@ -1803,6 +1810,30 @@ return $ret; } + function api_get_attachments($text) { + + $text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $text); + + $URLSearchString = "^\[\]"; + $ret = preg_match_all("/\[img\]([$URLSearchString]*)\[\/img\]/ism", $text, $images); + + if (!$ret) + return false; + + require_once("include/Photo.php"); + + $attachments = array(); + + foreach ($images[1] AS $image) { + $imagedata = get_photo_info($image); + + if ($imagedata) + $attachments[] = array("url" => $image, "mimetype" => $imagedata["mime"], "size" => $imagedata["size"]); + } + + return $attachments; + } + function api_get_entitities(&$text, $bbcode) { /* To-Do: @@ -2059,13 +2090,16 @@ 'in_reply_to_screen_name' => $in_reply_to_screen_name, 'geo' => NULL, 'favorited' => $item['starred'] ? true : false, - //'attachments' => array(), + 'attachments' => api_get_attachments($item["body"]), 'user' => $status_user , //'entities' => NULL, 'statusnet_html' => $statushtml, 'statusnet_conversation_id' => $item['parent'], ); + if (!$status["attachments"]) + unset($status["attachments"]); + if ($item['title'] != "") $status['statusnet_html'] = "

".bbcode($item['title'])."

\n".$status['statusnet_html']; From a94673ccb477aab7d49aa5bb22ef74897a16ec5a Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Thu, 1 Jan 2015 18:31:50 +0100 Subject: [PATCH 3/3] API: Support for attachments --- include/api.php | 116 ++++++++++++++++++++++++++---------------------- 1 file changed, 62 insertions(+), 54 deletions(-) diff --git a/include/api.php b/include/api.php index b879f8e427..fd306e6c29 100644 --- a/include/api.php +++ b/include/api.php @@ -872,8 +872,10 @@ $in_reply_to_screen_name = NULL; } + $converted = api_convert_item($item); + $status_info = array( - 'text' => trim(html2plain(bbcode(api_clean_plain_items($lastwall['body']), false, false, 2, true), 0)), + 'text' => $converted["text"], 'truncated' => false, 'created_at' => api_date($lastwall['created']), 'in_reply_to_status_id' => $in_reply_to_status_id, @@ -886,21 +888,16 @@ 'in_reply_to_screen_name' => $in_reply_to_screen_name, 'geo' => NULL, 'favorited' => $lastwall['starred'] ? true : false, - 'attachments' => api_get_attachments($lastwall['body']), 'user' => $user_info, - 'statusnet_html' => trim(bbcode($lastwall['body'], false, false)), + 'statusnet_html' => $converted["html"], 'statusnet_conversation_id' => $lastwall['parent'], ); - if (!$status_info["attachments"]) - unset($status_info["attachments"]); + if (count($converted["attachments"]) > 0) + $status_info["attachments"] = $converted["attachments"]; - if ($lastwall['title'] != "") - $status_info['statusnet_html'] = "

".bbcode($lastwall['title'])."

\n".$status_info['statusnet_html']; - - $entities = api_get_entitities($status_info['text'], $lastwall['body']); - if (count($entities) > 0) - $status_info['entities'] = $entities; + if (count($converted["entities"]) > 0) + $status_info["entities"] = $converted["entities"]; if (($lastwall['item_network'] != "") AND ($status["source"] == 'web')) $status_info["source"] = network_to_name($lastwall['item_network']); @@ -974,8 +971,11 @@ } } } + + $converted = api_convert_item($item); + $user_info['status'] = array( - 'text' => trim(html2plain(bbcode(api_clean_plain_items($lastwall['body']), false, false, 2, true), 0)), + 'text' => $converted["text"], 'truncated' => false, 'created_at' => api_date($lastwall['created']), 'in_reply_to_status_id' => $in_reply_to_status_id, @@ -988,20 +988,15 @@ 'in_reply_to_screen_name' => $in_reply_to_screen_name, 'geo' => NULL, 'favorited' => $lastwall['starred'] ? true : false, - 'attachments' => api_get_attachments($lastwall['body']), - 'statusnet_html' => trim(bbcode($lastwall['body'], false, false)), + 'statusnet_html' => $converted["html"], 'statusnet_conversation_id' => $lastwall['parent'], ); - if (!$user_info["attachments"]) - unset($user_info["attachments"]); + if (count($converted["attachments"]) > 0) + $user_info["status"]["attachments"] = $converted["attachments"]; - if ($lastwall['title'] != "") - $user_info['statusnet_html'] = "

".bbcode($lastwall['title'])."

\n".$user_info['statusnet_html']; - - $entities = api_get_entitities($user_info['text'], $lastwall['body']); - if (count($entities) > 0) - $user_info['entities'] = $entities; + if (count($converted["entities"]) > 0) + $user_info["status"]["entities"] = $converted["entities"]; if (($lastwall['item_network'] != "") AND ($user_info["status"]["source"] == 'web')) $user_info["status"]["source"] = network_to_name($lastwall['item_network']); @@ -1810,8 +1805,41 @@ return $ret; } - function api_get_attachments($text) { + function api_convert_item($item) { + $body = $item['body']; + $attachments = api_get_attachments($body); + + // Workaround for ostatus messages where the title is identically to the body + $html = bbcode(api_clean_plain_items($body), false, false, 2, true); + $statusbody = trim(html2plain($html, 0)); + + // handle data: images + $statusbody = api_format_items_embeded_images($item,$statusbody); + + $statustitle = trim($item['title']); + + if (($statustitle != '') and (strpos($statusbody, $statustitle) !== false)) + $statustext = trim($statusbody); + else + $statustext = trim($statustitle."\n\n".$statusbody); + + if (($item["network"] == NETWORK_FEED) and (strlen($statustext)> 1000)) + $statustext = substr($statustext, 0, 1000)."... \n".$item["plink"]; + + $statushtml = trim(bbcode($body, false, false)); + + if ($item['title'] != "") + $statushtml = "

".bbcode($item['title'])."

\n".$statushtml; + + $entities = api_get_entitities($statustext, $body); + + return(array("text" => $statustext, "html" => $statushtml, "attachments" => $attachments, "entities" => $entities)); + } + + function api_get_attachments(&$body) { + + $text = $body; $text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $text); $URLSearchString = "^\[\]"; @@ -1831,6 +1859,10 @@ $attachments[] = array("url" => $image, "mimetype" => $imagedata["mime"], "size" => $imagedata["size"]); } + if (strstr($_SERVER['HTTP_USER_AGENT'], "AndStatus")) + foreach ($images[0] AS $orig) + $body = str_replace($orig, "", $body); + return $attachments; } @@ -2055,29 +2087,10 @@ $in_reply_to_status_id_str = NULL; } - // Workaround for ostatus messages where the title is identically to the body - //$statusbody = trim(html2plain(bbcode(api_clean_plain_items($item['body']), false, false, 5, true), 0)); - $html = bbcode(api_clean_plain_items($item['body']), false, false, 2, true); - $statusbody = trim(html2plain($html, 0)); - - // handle data: images - $statusbody = api_format_items_embeded_images($item,$statusbody); - - $statustitle = trim($item['title']); - - if (($statustitle != '') and (strpos($statusbody, $statustitle) !== false)) - $statustext = trim($statusbody); - else - $statustext = trim($statustitle."\n\n".$statusbody); - - if (($item["network"] == NETWORK_FEED) and (strlen($statustext)> 1000)) - $statustext = substr($statustext, 0, 1000)."... \n".$item["plink"]; - - $statushtml = trim(bbcode($item['body'], false, false)); - + $converted = api_convert_item($item); $status = array( - 'text' => $statustext, + 'text' => $converted["text"], 'truncated' => False, 'created_at'=> api_date($item['created']), 'in_reply_to_status_id' => $in_reply_to_status_id, @@ -2090,22 +2103,17 @@ 'in_reply_to_screen_name' => $in_reply_to_screen_name, 'geo' => NULL, 'favorited' => $item['starred'] ? true : false, - 'attachments' => api_get_attachments($item["body"]), 'user' => $status_user , //'entities' => NULL, - 'statusnet_html' => $statushtml, + 'statusnet_html' => $converted["html"], 'statusnet_conversation_id' => $item['parent'], ); - if (!$status["attachments"]) - unset($status["attachments"]); + if (count($converted["attachments"]) > 0) + $status["attachments"] = $converted["attachments"]; - if ($item['title'] != "") - $status['statusnet_html'] = "

".bbcode($item['title'])."

\n".$status['statusnet_html']; - - $entities = api_get_entitities($status['text'], $item['body']); - if (count($entities) > 0) - $status['entities'] = $entities; + if (count($converted["entities"]) > 0) + $status["entities"] = $converted["entities"]; if (($item['item_network'] != "") AND ($status["source"] == 'web')) $status["source"] = network_to_name($item['item_network']);