]> git.mxchange.org Git - friendica.git/blobdiff - mod/photos.php
Merge pull request #12029 from annando/warning
[friendica.git] / mod / photos.php
index b4ffb756c160248b58cb47a8057610a8963cb828..8111fffa3079e1b01af8b794874413111ddbc1aa 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2022, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -55,8 +55,8 @@ use Friendica\Util\Temporal;
 use Friendica\Util\XML;
 use Friendica\Network\HTTPException;
 
-function photos_init(App $a) {
-
+function photos_init(App $a)
+{
        if (DI::config()->get('system', 'block_public') && !Session::isAuthenticated()) {
                return;
        }
@@ -65,7 +65,7 @@ function photos_init(App $a) {
 
        if (DI::args()->getArgc() > 1) {
                $owner = User::getOwnerDataByNick(DI::args()->getArgv()[1]);
-               if (!$owner) {
+               if (!isset($owner['account_removed']) || $owner['account_removed']) {
                        throw new HTTPException\NotFoundException(DI::l10n()->t('User not found.'));
                }
 
@@ -157,16 +157,16 @@ function photos_post(App $a)
        }
 
        if (!$can_post) {
-               notice(DI::l10n()->t('Permission denied.'));
-               exit();
+               DI::sysmsg()->addNotice(DI::l10n()->t('Permission denied.'));
+               System::exit();
        }
 
        $owner_record = User::getOwnerDataById($page_owner_uid);
 
        if (!$owner_record) {
-               notice(DI::l10n()->t('Contact information unavailable'));
+               DI::sysmsg()->addNotice(DI::l10n()->t('Contact information unavailable'));
                DI::logger()->info('photos_post: unable to locate contact record for page owner. uid=' . $page_owner_uid);
-               exit();
+               System::exit();
        }
 
        $aclFormatter = DI::aclFormatter();
@@ -187,13 +187,13 @@ function photos_post(App $a)
        }
 
        if (DI::args()->getArgc() > 3 && DI::args()->getArgv()[2] === 'album') {
-               if (!Strings::isHex(DI::args()->getArgv()[3])) {
+               if (!Strings::isHex(DI::args()->getArgv()[3] ?? '')) {
                        DI::baseUrl()->redirect('photos/' . $user['nickname'] . '/album');
                }
                $album = hex2bin(DI::args()->getArgv()[3]);
 
                if (!DBA::exists('photo', ['album' => $album, 'uid' => $page_owner_uid, 'photo-type' => Photo::DEFAULT])) {
-                       notice(DI::l10n()->t('Album not found.'));
+                       DI::sysmsg()->addNotice(DI::l10n()->t('Album not found.'));
                        DI::baseUrl()->redirect('photos/' . $user['nickname'] . '/album');
                        return; // NOTREACHED
                }
@@ -247,9 +247,9 @@ function photos_post(App $a)
 
                                // Update the photo albums cache
                                Photo::clearAlbumCache($page_owner_uid);
-                               notice(DI::l10n()->t('Album successfully deleted'));
+                               DI::sysmsg()->addNotice(DI::l10n()->t('Album successfully deleted'));
                        } else {
-                               notice(DI::l10n()->t('Album was empty.'));
+                               DI::sysmsg()->addNotice(DI::l10n()->t('Album was empty.'));
                        }
                }
 
@@ -281,7 +281,7 @@ function photos_post(App $a)
                                // Update the photo albums cache
                                Photo::clearAlbumCache($page_owner_uid);
                        } else {
-                               notice(DI::l10n()->t('Failed to delete the photo.'));
+                               DI::sysmsg()->addNotice(DI::l10n()->t('Failed to delete the photo.'));
                                DI::baseUrl()->redirect('photos/' . DI::args()->getArgv()[1] . '/image/' . DI::args()->getArgv()[3]);
                        }
 
@@ -304,7 +304,7 @@ function photos_post(App $a)
                }
 
                if (!empty($_POST['rotate']) && (intval($_POST['rotate']) == 1 || intval($_POST['rotate']) == 2)) {
-                       Logger::notice('rotate');
+                       Logger::debug('rotate');
 
                        $photo = Photo::getPhotoForUser($page_owner_uid, $resource_id);
 
@@ -355,18 +355,12 @@ function photos_post(App $a)
                        if ($albname !== $origaname) {
                                Photo::clearAlbumCache($page_owner_uid);
                        }
-                       /* Don't make the item visible if the only change was the album name */
-
-                       $visibility = 0;
-                       if ($photo['desc'] !== $desc || strlen($rawtags)) {
-                               $visibility = 1;
-                       }
                }
 
                if (DBA::isResult($photos) && !$item_id) {
                        // Create item container
                        $title = '';
-                       $uri = Item::newURI($page_owner_uid);
+                       $uri = Item::newURI();
 
                        $arr = [];
                        $arr['guid']          = System::createUUID();
@@ -387,7 +381,7 @@ function photos_post(App $a)
                        $arr['allow_gid']     = $photo['allow_gid'];
                        $arr['deny_cid']      = $photo['deny_cid'];
                        $arr['deny_gid']      = $photo['deny_gid'];
-                       $arr['visible']       = $visibility;
+                       $arr['visible']       = 0;
                        $arr['origin']        = 1;
 
                        $arr['body']          = '[url=' . DI::baseUrl() . '/photos/' . $user['nickname'] . '/image/' . $photo['resource-id'] . ']'
@@ -530,46 +524,42 @@ function photos_post(App $a)
 
                        if (count($taginfo)) {
                                foreach ($taginfo as $tagged) {
-                                       $uri = Item::newURI($page_owner_uid);
-
-                                       $arr = [];
-                                       $arr['guid']          = System::createUUID();
-                                       $arr['uid']           = $page_owner_uid;
-                                       $arr['uri']           = $uri;
-                                       $arr['wall']          = 1;
-                                       $arr['contact-id']    = $owner_record['id'];
-                                       $arr['owner-name']    = $owner_record['name'];
-                                       $arr['owner-link']    = $owner_record['url'];
-                                       $arr['owner-avatar']  = $owner_record['thumb'];
-                                       $arr['author-name']   = $owner_record['name'];
-                                       $arr['author-link']   = $owner_record['url'];
-                                       $arr['author-avatar'] = $owner_record['thumb'];
-                                       $arr['title']         = '';
-                                       $arr['allow_cid']     = $photo['allow_cid'];
-                                       $arr['allow_gid']     = $photo['allow_gid'];
-                                       $arr['deny_cid']      = $photo['deny_cid'];
-                                       $arr['deny_gid']      = $photo['deny_gid'];
-                                       $arr['visible']       = 1;
-                                       $arr['verb']          = Activity::TAG;
-                                       $arr['gravity']       = GRAVITY_PARENT;
-                                       $arr['object-type']   = Activity\ObjectType::PERSON;
-                                       $arr['target-type']   = Activity\ObjectType::IMAGE;
-                                       $arr['inform']        = $tagged[2];
-                                       $arr['origin']        = 1;
-                                       $arr['body']          = DI::l10n()->t('%1$s was tagged in %2$s by %3$s', '[url=' . $tagged[1] . ']' . $tagged[0] . '[/url]', '[url=' . DI::baseUrl() . '/photos/' . $owner_record['nickname'] . '/image/' . $photo['resource-id'] . ']' . DI::l10n()->t('a photo') . '[/url]', '[url=' . $owner_record['url'] . ']' . $owner_record['name'] . '[/url]') ;
-                                       $arr['body'] .= "\n\n" . '[url=' . DI::baseUrl() . '/photos/' . $owner_record['nickname'] . '/image/' . $photo['resource-id'] . ']' . '[img]' . DI::baseUrl() . "/photo/" . $photo['resource-id'] . '-' . $best . '.' . $ext . '[/img][/url]' . "\n" ;
-
-                                       $arr['object'] = '<object><type>' . Activity\ObjectType::PERSON . '</type><title>' . $tagged[0] . '</title><id>' . $tagged[1] . '/' . $tagged[0] . '</id>';
-                                       $arr['object'] .= '<link>' . XML::escape('<link rel="alternate" type="text/html" href="' . $tagged[1] . '" />' . "\n");
+                                       $uri = Item::newURI();
+
+                                       $arr = [
+                                               'guid'          => System::createUUID(),
+                                               'uid'           => $page_owner_uid,
+                                               'uri'           => $uri,
+                                               'wall'          => 1,
+                                               'contact-id'    => $owner_record['id'],
+                                               'owner-name'    => $owner_record['name'],
+                                               'owner-link'    => $owner_record['url'],
+                                               'owner-avatar'  => $owner_record['thumb'],
+                                               'author-name'   => $owner_record['name'],
+                                               'author-link'   => $owner_record['url'],
+                                               'author-avatar' => $owner_record['thumb'],
+                                               'title'         => '',
+                                               'allow_cid'     => $photo['allow_cid'],
+                                               'allow_gid'     => $photo['allow_gid'],
+                                               'deny_cid'      => $photo['deny_cid'],
+                                               'deny_gid'      => $photo['deny_gid'],
+                                               'visible'       => 0,
+                                               'verb'          => Activity::TAG,
+                                               'gravity'       => Item::GRAVITY_PARENT,
+                                               'object-type'   => Activity\ObjectType::PERSON,
+                                               'target-type'   => Activity\ObjectType::IMAGE,
+                                               'inform'        => $tagged[2],
+                                               'origin'        => 1,
+                                               'body'          => DI::l10n()->t('%1$s was tagged in %2$s by %3$s', '[url=' . $tagged[1] . ']' . $tagged[0] . '[/url]', '[url=' . DI::baseUrl() . '/photos/' . $owner_record['nickname'] . '/image/' . $photo['resource-id'] . ']' . DI::l10n()->t('a photo') . '[/url]', '[url=' . $owner_record['url'] . ']' . $owner_record['name'] . '[/url]') . "\n\n" . '[url=' . DI::baseUrl() . '/photos/' . $owner_record['nickname'] . '/image/' . $photo['resource-id'] . ']' . '[img]' . DI::baseUrl() . '/photo/' . $photo['resource-id'] . '-' . $best . '.' . $ext . '[/img][/url]' . "\n",
+                                               'object'        => '<object><type>' . Activity\ObjectType::PERSON . '</type><title>' . $tagged[0] . '</title><id>' . $tagged[1] . '/' . $tagged[0] . '</id><link>' . XML::escape('<link rel="alternate" type="text/html" href="' . $tagged[1] . '" />' . "\n"),
+                                               'target'        => '<target><type>' . Activity\ObjectType::IMAGE . '</type><title>' . $photo['desc'] . '</title><id>' . DI::baseUrl() . '/photos/' . $owner_record['nickname'] . '/image/' . $photo['resource-id'] . '</id><link>' . XML::escape('<link rel="alternate" type="text/html" href="' . DI::baseUrl() . '/photos/' . $owner_record['nickname'] . '/image/' . $photo['resource-id'] . '" />' . "\n" . '<link rel="preview" type="' . $photo['type'] . '" href="' . DI::baseUrl() . '/photo/' . $photo['resource-id'] . '-' . $best . '.' . $ext . '" />') . '</link></target>',
+                                       ];
+
                                        if ($tagged[3]) {
                                                $arr['object'] .= XML::escape('<link rel="photo" type="' . $photo['type'] . '" href="' . $tagged[3]['photo'] . '" />' . "\n");
                                        }
                                        $arr['object'] .= '</link></object>' . "\n";
 
-                                       $arr['target'] = '<target><type>' . Activity\ObjectType::IMAGE . '</type><title>' . $photo['desc'] . '</title><id>'
-                                               . DI::baseUrl() . '/photos/' . $owner_record['nickname'] . '/image/' . $photo['resource-id'] . '</id>';
-                                       $arr['target'] .= '<link>' . XML::escape('<link rel="alternate" type="text/html" href="' . DI::baseUrl() . '/photos/' . $owner_record['nickname'] . '/image/' . $photo['resource-id'] . '" />' . "\n" . '<link rel="preview" type="' . $photo['type'] . '" href="' . DI::baseUrl() . "/photo/" . $photo['resource-id'] . '-' . $best . '.' . $ext . '" />') . '</link></target>';
-
                                        Item::insert($arr);
                                }
                        }
@@ -586,7 +576,7 @@ function photos_post(App $a)
        $album    = trim($_REQUEST['album'] ?? '');
        $newalbum = trim($_REQUEST['newalbum'] ?? '');
 
-       Logger::info('album= ' . $album . ' newalbum= ' . $newalbum);
+       Logger::debug('album= ' . $album . ' newalbum= ' . $newalbum);
 
        if (!strlen($album)) {
                if (strlen($newalbum)) {
@@ -604,7 +594,7 @@ function photos_post(App $a)
         * they acquire comments, likes, dislikes, and/or tags
         */
 
-       $r = Photo::selectToArray([], ['`album` = ? AND `uid` = ? AND `created` > UTC_TIMESTAMP() - INTERVAL 3 HOUR', $album, $page_owner_uid]);
+       $r = Photo::selectToArray([], ['`album` = ? AND `uid` = ? AND `created` > ?', $album, $page_owner_uid, DateTimeFormat::utc('now - 3 hours')]);
 
        if (!DBA::isResult($r) || ($album == DI::l10n()->t(Photo::PROFILE_PHOTOS))) {
                $visible = 1;
@@ -639,21 +629,21 @@ function photos_post(App $a)
        if ($error !== UPLOAD_ERR_OK) {
                switch ($error) {
                        case UPLOAD_ERR_INI_SIZE:
-                               notice(DI::l10n()->t('Image exceeds size limit of %s', ini_get('upload_max_filesize')));
+                               DI::sysmsg()->addNotice(DI::l10n()->t('Image exceeds size limit of %s', ini_get('upload_max_filesize')));
                                break;
                        case UPLOAD_ERR_FORM_SIZE:
-                               notice(DI::l10n()->t('Image exceeds size limit of %s', Strings::formatBytes($_REQUEST['MAX_FILE_SIZE'] ?? 0)));
+                               DI::sysmsg()->addNotice(DI::l10n()->t('Image exceeds size limit of %s', Strings::formatBytes($_REQUEST['MAX_FILE_SIZE'] ?? 0)));
                                break;
                        case UPLOAD_ERR_PARTIAL:
-                               notice(DI::l10n()->t('Image upload didn\'t complete, please try again'));
+                               DI::sysmsg()->addNotice(DI::l10n()->t('Image upload didn\'t complete, please try again'));
                                break;
                        case UPLOAD_ERR_NO_FILE:
-                               notice(DI::l10n()->t('Image file is missing'));
+                               DI::sysmsg()->addNotice(DI::l10n()->t('Image file is missing'));
                                break;
                        case UPLOAD_ERR_NO_TMP_DIR:
                        case UPLOAD_ERR_CANT_WRITE:
                        case UPLOAD_ERR_EXTENSION:
-                               notice(DI::l10n()->t('Server can\'t accept new file upload at this time, please contact your administrator'));
+                               DI::sysmsg()->addNotice(DI::l10n()->t('Server can\'t accept new file upload at this time, please contact your administrator'));
                                break;
                }
                @unlink($src);
@@ -669,7 +659,7 @@ function photos_post(App $a)
        $maximagesize = DI::config()->get('system', 'maximagesize');
 
        if ($maximagesize && ($filesize > $maximagesize)) {
-               notice(DI::l10n()->t('Image exceeds size limit of %s', Strings::formatBytes($maximagesize)));
+               DI::sysmsg()->addNotice(DI::l10n()->t('Image exceeds size limit of %s', Strings::formatBytes($maximagesize)));
                @unlink($src);
                $foo = 0;
                Hook::callAll('photo_post_end', $foo);
@@ -677,22 +667,22 @@ function photos_post(App $a)
        }
 
        if (!$filesize) {
-               notice(DI::l10n()->t('Image file is empty.'));
+               DI::sysmsg()->addNotice(DI::l10n()->t('Image file is empty.'));
                @unlink($src);
                $foo = 0;
                Hook::callAll('photo_post_end', $foo);
                return;
        }
 
-       Logger::info('loading the contents of ' . $src);
+       Logger::debug('loading contents', ['src' => $src]);
 
        $imagedata = @file_get_contents($src);
 
        $image = new Image($imagedata, $type);
 
        if (!$image->isValid()) {
-               Logger::info('unable to process image');
-               notice(DI::l10n()->t('Unable to process image.'));
+               Logger::notice('unable to process image');
+               DI::sysmsg()->addNotice(DI::l10n()->t('Unable to process image.'));
                @unlink($src);
                $foo = 0;
                Hook::callAll('photo_post_end',$foo);
@@ -717,8 +707,8 @@ function photos_post(App $a)
        $r = Photo::store($image, $page_owner_uid, $visitor, $resource_id, $filename, $album, 0 , Photo::DEFAULT, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny);
 
        if (!$r) {
-               Logger::info('image store failed');
-               notice(DI::l10n()->t('Image upload failed.'));
+               Logger::warning('image store failed');
+               DI::sysmsg()->addNotice(DI::l10n()->t('Image upload failed.'));
                return;
        }
 
@@ -734,7 +724,7 @@ function photos_post(App $a)
                $smallest = 2;
        }
 
-       $uri = Item::newURI($page_owner_uid);
+       $uri = Item::newURI();
 
        // Create item container
        $lat = $lon = null;
@@ -805,12 +795,12 @@ function photos_content(App $a)
        }
 
        if (DI::config()->get('system', 'block_public') && !Session::isAuthenticated()) {
-               notice(DI::l10n()->t('Public access denied.'));
+               DI::sysmsg()->addNotice(DI::l10n()->t('Public access denied.'));
                return;
        }
 
        if (empty($user)) {
-               notice(DI::l10n()->t('No photos selected'));
+               DI::sysmsg()->addNotice(DI::l10n()->t('No photos selected'));
                return;
        }
 
@@ -879,7 +869,7 @@ function photos_content(App $a)
        }
 
        if ($user['hidewall'] && (local_user() != $owner_uid) && !$remote_contact) {
-               notice(DI::l10n()->t('Access to this item is restricted.'));
+               DI::sysmsg()->addNotice(DI::l10n()->t('Access to this item is restricted.'));
                return;
        }
 
@@ -894,11 +884,11 @@ function photos_content(App $a)
        // Display upload form
        if ($datatype === 'upload') {
                if (!$can_post) {
-                       notice(DI::l10n()->t('Permission denied.'));
+                       DI::sysmsg()->addNotice(DI::l10n()->t('Permission denied.'));
                        return;
                }
 
-               $selname = Strings::isHex($datum) ? hex2bin($datum) : '';
+               $selname = (!is_null($datum) && Strings::isHex($datum)) ? hex2bin($datum) : '';
 
                $albumselect = '';
 
@@ -960,7 +950,7 @@ function photos_content(App $a)
        // Display a single photo album
        if ($datatype === 'album') {
                // if $datum is not a valid hex, redirect to the default page
-               if (!Strings::isHex($datum)) {
+               if (is_null($datum) || !Strings::isHex($datum)) {
                        DI::baseUrl()->redirect('photos/' . $user['nickname']. '/album');
                }
                $album = hex2bin($datum);
@@ -983,7 +973,7 @@ function photos_content(App $a)
 
                /// @TODO I have seen this many times, maybe generalize it script-wide and encapsulate it?
                $order_field = $_GET['order'] ?? '';
-               if ($order_field === 'posted') {
+               if ($order_field === 'created') {
                        $order = 'ASC';
                } else {
                        $order = 'DESC';
@@ -1037,10 +1027,10 @@ function photos_content(App $a)
                        $drop = [DI::l10n()->t('Drop Album'), 'photos/' . $user['nickname'] . '/album/' . bin2hex($album) . '/drop'];
                }
 
-               if ($order_field === 'posted') {
+               if ($order_field === 'created') {
                        $order =  [DI::l10n()->t('Show Newest First'), 'photos/' . $user['nickname'] . '/album/' . bin2hex($album), 'oldest'];
                } else {
-                       $order = [DI::l10n()->t('Show Oldest First'), 'photos/' . $user['nickname'] . '/album/' . bin2hex($album) . '?order=posted', 'newest'];
+                       $order = [DI::l10n()->t('Show Oldest First'), 'photos/' . $user['nickname'] . '/album/' . bin2hex($album) . '?order=created', 'newest'];
                }
 
                $photos = [];
@@ -1060,7 +1050,7 @@ function photos_content(App $a)
                                        'id' => $rr['id'],
                                        'twist' => ' ' . ($twist ? 'rotleft' : 'rotright') . rand(2,4),
                                        'link' => 'photos/' . $user['nickname'] . '/image/' . $rr['resource-id']
-                                               . ($order_field === 'posted' ? '?order=posted' : ''),
+                                               . ($order_field === 'created' ? '?order=created' : ''),
                                        'title' => DI::l10n()->t('View Photo'),
                                        'src' => 'photo/' . $rr['resource-id'] . '-' . $rr['scale'] . '.' .$ext,
                                        'alt' => $imgalt_e,
@@ -1090,13 +1080,13 @@ function photos_content(App $a)
        // Display one photo
        if ($datatype === 'image') {
                // fetch image, item containing image, then comments
-               $ph = Photo::selectToArray([], ["`uid` = ? AND `resource-id` = ? " . $sql_extra, $owner_uid, $datum], ['order' => ['scale' => true]]);
+               $ph = Photo::selectToArray([], ["`uid` = ? AND `resource-id` = ? " . $sql_extra, $owner_uid, $datum], ['order' => ['scale']]);
 
                if (!DBA::isResult($ph)) {
                        if (DBA::exists('photo', ['resource-id' => $datum, 'uid' => $owner_uid])) {
-                               notice(DI::l10n()->t('Permission denied. Access to this item may be restricted.'));
+                               DI::sysmsg()->addNotice(DI::l10n()->t('Permission denied. Access to this item may be restricted.'));
                        } else {
-                               notice(DI::l10n()->t('Photo not available'));
+                               DI::sysmsg()->addNotice(DI::l10n()->t('Photo not available'));
                        }
                        return;
                }
@@ -1128,13 +1118,15 @@ function photos_content(App $a)
                if ($cmd === 'view' && !DI::config()->get('system', 'no_count', false)) {
                        $order_field = $_GET['order'] ?? '';
 
-                       if ($order_field === 'posted') {
-                               $order = 'ASC';
+                       if ($order_field === 'created') {
+                               $params = ['order' => [$order_field]];
+                       } elseif (!empty($order_field)) {
+                               $params = ['order' => [$order_field => true]];
                        } else {
-                               $order = 'DESC';
+                               $params = [];
                        }
 
-                       $prvnxt = Photo::selectToArray(['resource-id'], ["`album` = ? AND `uid` = ? AND `scale` = ?" . $sql_extra, $ph[0]['album'], $owner_uid, 0]);
+                       $prvnxt = Photo::selectToArray(['resource-id'], ["`album` = ? AND `uid` = ? AND `scale` = ?" . $sql_extra, $ph[0]['album'], $owner_uid, 0], $params);
 
                        if (DBA::isResult($prvnxt)) {
                                $prv = null;
@@ -1154,10 +1146,10 @@ function photos_content(App $a)
                                }
 
                                if (!is_null($prv)) {
-                                       $prevlink = 'photos/' . $user['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] . ($order_field === 'posted' ? '?order=posted' : '');
+                                       $prevlink = 'photos/' . $user['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] . ($order_field === 'created' ? '?order=created' : '');
                                }
                                if (!is_null($nxt)) {
-                                       $nextlink = 'photos/' . $user['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] . ($order_field === 'posted' ? '?order=posted' : '');
+                                       $nextlink = 'photos/' . $user['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] . ($order_field === 'created' ? '?order=created' : '');
                                }
 
                                $tpl = Renderer::getMarkupTemplate('photo_edit_head.tpl');
@@ -1237,7 +1229,7 @@ function photos_content(App $a)
                $link_item = Post::selectFirst([], ["`resource-id` = ?" . $sql_extra, $datum]);
 
                if (!empty($link_item['parent']) && !empty($link_item['uid'])) {
-                       $condition = ["`parent` = ? AND `gravity` = ?",  $link_item['parent'], GRAVITY_COMMENT];
+                       $condition = ["`parent` = ? AND `gravity` = ?",  $link_item['parent'], Item::GRAVITY_COMMENT];
                        $total = Post::count($condition);
 
                        $pager = new Pager(DI::l10n(), DI::args()->getQueryString());
@@ -1257,14 +1249,12 @@ function photos_content(App $a)
                $tags = null;
 
                if (!empty($link_item['id'])) {
-                       $tag_text = Tag::getCSVByURIId($link_item['uri-id']);
-                       $arr = explode(',', $tag_text);
                        // parse tags and add links
                        $tag_arr = [];
-                       foreach ($arr as $tag) {
+                       foreach (Tag::getByURIId($link_item['uri-id']) as $tag) {
                                $tag_arr[] = [
-                                       'name' => BBCode::convert($tag),
-                                       'removeurl' => '/tagrm/' . $link_item['id'] . '/' . bin2hex($tag)
+                                       'name' => $tag['name'],
+                                       'removeurl' => '/tagrm/' . $link_item['id'] . '/' . bin2hex($tag['name'])
                                ];
                        }
                        $tags = ['title' => DI::l10n()->t('Tags: '), 'tags' => $tag_arr];
@@ -1410,7 +1400,7 @@ function photos_content(App $a)
 
                                        if (($activity->match($item['verb'], Activity::LIKE) ||
                                             $activity->match($item['verb'], Activity::DISLIKE)) &&
-                                           ($item['gravity'] != GRAVITY_PARENT)) {
+                                           ($item['gravity'] != Item::GRAVITY_PARENT)) {
                                                continue;
                                        }
 
@@ -1427,25 +1417,25 @@ function photos_content(App $a)
                                        $drop = [
                                                'dropping' => $dropping,
                                                'pagedrop' => false,
-                                               'select' => DI::l10n()->t('Select'),
-                                               'delete' => DI::l10n()->t('Delete'),
+                                               'select'   => DI::l10n()->t('Select'),
+                                               'delete'   => DI::l10n()->t('Delete'),
                                        ];
 
                                        $title_e = $item['title'];
-                                       $body_e = BBCode::convert($item['body']);
+                                       $body_e = BBCode::convertForUriId($item['uri-id'], $item['body']);
 
                                        $comments .= Renderer::replaceMacros($template,[
-                                               '$id' => $item['id'],
+                                               '$id'          => $item['id'],
                                                '$profile_url' => $profile_url,
-                                               '$name' => $item['author-name'],
-                                               '$thumb' => $item['author-avatar'],
-                                               '$sparkle' => $sparkle,
-                                               '$title' => $title_e,
-                                               '$body' => $body_e,
-                                               '$ago' => Temporal::getRelativeDate($item['created']),
-                                               '$indent' => (($item['parent'] != $item['id']) ? ' comment' : ''),
-                                               '$drop' => $drop,
-                                               '$comment' => $comment
+                                               '$name'        => $item['author-name'],
+                                               '$thumb'       => $item['author-avatar'],
+                                               '$sparkle'     => $sparkle,
+                                               '$title'       => $title_e,
+                                               '$body'        => $body_e,
+                                               '$ago'         => Temporal::getRelativeDate($item['created']),
+                                               '$indent'      => (($item['parent'] != $item['id']) ? ' comment' : ''),
+                                               '$drop'        => $drop,
+                                               '$comment'     => $comment
                                        ]);
 
                                        if (($can_post || Security::canWriteToUserWall($owner_uid))) {