]> git.mxchange.org Git - friendica-addons.git/blobdiff - tumblr/tumblr.php
tumblr: wrong "page" values are corrected automatically
[friendica-addons.git] / tumblr / tumblr.php
index 83c0419f367d6999edbfc9d66fb0ac65df426a4b..c5c3b7b141fe9d4f195ef5a9643eae847db5e617 100644 (file)
@@ -9,16 +9,23 @@
 
 require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'tumblroauth.php';
 
-use Friendica\App;
 use Friendica\Content\Text\BBCode;
+use Friendica\Content\Text\NPF;
 use Friendica\Core\Hook;
 use Friendica\Core\Logger;
 use Friendica\Core\Renderer;
-use Friendica\Database\DBA;
+use Friendica\Core\System;
 use Friendica\DI;
+use Friendica\Model\Item;
+use Friendica\Model\Photo;
 use Friendica\Model\Post;
 use Friendica\Model\Tag;
-use Friendica\Util\Strings;
+use Friendica\Util\DateTimeFormat;
+use Friendica\Util\Network;
+use GuzzleHttp\Client;
+use GuzzleHttp\Exception\RequestException;
+use GuzzleHttp\HandlerStack;
+use GuzzleHttp\Subscriber\Oauth\Oauth1;
 
 function tumblr_install()
 {
@@ -30,25 +37,30 @@ function tumblr_install()
        Hook::register('connector_settings_post', 'addon/tumblr/tumblr.php', 'tumblr_settings_post');
 }
 
+/**
+ * This is a statement rather than an actual function definition. The simple
+ * existence of this method is checked to figure out if the addon offers a
+ * module.
+ */
 function tumblr_module()
 {
 }
 
-function tumblr_content(App $a)
+function tumblr_content()
 {
-       if (! local_user()) {
-               notice(DI::l10n()->t('Permission denied.') . EOL);
+       if (!DI::userSession()->getLocalUserId()) {
+               DI::sysmsg()->addNotice(DI::l10n()->t('Permission denied.'));
                return '';
        }
 
        if (isset(DI::args()->getArgv()[1])) {
                switch (DI::args()->getArgv()[1]) {
-                       case "connect":
-                               $o = tumblr_connect($a);
+                       case 'connect':
+                               $o = tumblr_connect();
                                break;
 
-                       case "callback":
-                               $o = tumblr_callback($a);
+                       case 'callback':
+                               $o = tumblr_callback();
                                break;
 
                        default:
@@ -56,48 +68,42 @@ function tumblr_content(App $a)
                                break;
                }
        } else {
-               $o = tumblr_connect($a);
+               $o = tumblr_connect();
        }
 
        return $o;
 }
 
-function tumblr_addon_admin(App $a, &$o)
+function tumblr_addon_admin(string &$o)
 {
-       $t = Renderer::getMarkupTemplate( "admin.tpl", "addon/tumblr/" );
+       $t = Renderer::getMarkupTemplate('admin.tpl', 'addon/tumblr/');
 
        $o = Renderer::replaceMacros($t, [
                '$submit' => DI::l10n()->t('Save Settings'),
                // name, label, value, help, [extra values]
-               '$consumer_key' => ['consumer_key', DI::l10n()->t('Consumer Key'),  DI::config()->get('tumblr', 'consumer_key' ), ''],
-               '$consumer_secret' => ['consumer_secret', DI::l10n()->t('Consumer Secret'),  DI::config()->get('tumblr', 'consumer_secret' ), ''],
+               '$consumer_key' => ['consumer_key', DI::l10n()->t('Consumer Key'), DI::config()->get('tumblr', 'consumer_key'), ''],
+               '$consumer_secret' => ['consumer_secret', DI::l10n()->t('Consumer Secret'), DI::config()->get('tumblr', 'consumer_secret'), ''],
        ]);
 }
 
-function tumblr_addon_admin_post(App $a)
+function tumblr_addon_admin_post()
 {
-       $consumer_key    =       (!empty($_POST['consumer_key'])      ? Strings::escapeTags(trim($_POST['consumer_key']))   : '');
-       $consumer_secret =       (!empty($_POST['consumer_secret'])   ? Strings::escapeTags(trim($_POST['consumer_secret'])): '');
-
-       DI::config()->set('tumblr', 'consumer_key',$consumer_key);
-       DI::config()->set('tumblr', 'consumer_secret',$consumer_secret);
+       DI::config()->set('tumblr', 'consumer_key', trim($_POST['consumer_key'] ?? ''));
+       DI::config()->set('tumblr', 'consumer_secret', trim($_POST['consumer_secret'] ?? ''));
 }
 
-function tumblr_connect(App $a)
+function tumblr_connect()
 {
        // Start a session.  This is necessary to hold on to  a few keys the callback script will also need
        session_start();
 
-       // Include the TumblrOAuth library
-       //require_once('addon/tumblr/tumblroauth/tumblroauth.php');
-
        // Define the needed keys
        $consumer_key = DI::config()->get('tumblr', 'consumer_key');
        $consumer_secret = DI::config()->get('tumblr', 'consumer_secret');
 
        // The callback URL is the script that gets called after the user authenticates with tumblr
        // In this example, it would be the included callback.php
-       $callback_url = DI::baseUrl()->get()."/tumblr/callback";
+       $callback_url = DI::baseUrl() . '/tumblr/callback';
 
        // Let's begin.  First we need a Request Token.  The request token is required to send the user
        // to Tumblr's login page.
@@ -110,17 +116,17 @@ function tumblr_connect(App $a)
        $request_token = $tum_oauth->getRequestToken($callback_url);
 
        // Store the request token and Request Token Secret as out callback.php script will need this
-       $_SESSION['request_token'] = $token = $request_token['oauth_token'];
-       $_SESSION['request_token_secret'] = $request_token['oauth_token_secret'];
+       DI::session()->set('request_token', $request_token['oauth_token']);
+       DI::session()->set('request_token_secret', $request_token['oauth_token_secret']);
 
        // Check the HTTP Code.  It should be a 200 (OK), if it's anything else then something didn't work.
        switch ($tum_oauth->http_code) {
                case 200:
                        // Ask Tumblr to give us a special address to their login page
-                       $url = $tum_oauth->getAuthorizeURL($token);
+                       $url = $tum_oauth->getAuthorizeURL($request_token['oauth_token']);
 
                        // Redirect the user to the login URL given to us by Tumblr
-                       header('Location: ' . $url);
+                       System::externalRedirect($url);
 
                        /*
                         * That's it for our side.  The user is sent to a Tumblr Login page and
@@ -138,14 +144,13 @@ function tumblr_connect(App $a)
        return $o;
 }
 
-function tumblr_callback(App $a)
+function tumblr_callback()
 {
        // Start a session, load the library
        session_start();
-       //require_once('addon/tumblr/tumblroauth/tumblroauth.php');
 
        // Define the needed keys
-       $consumer_key = DI::config()->get('tumblr', 'consumer_key');
+       $consumer_key    = DI::config()->get('tumblr', 'consumer_key');
        $consumer_secret = DI::config()->get('tumblr', 'consumer_secret');
 
        // Once the user approves your app at Tumblr, they are sent back to this script.
@@ -155,14 +160,14 @@ function tumblr_callback(App $a)
 
        // Create instance of TumblrOAuth.
        // It'll need our Consumer Key and Secret as well as our Request Token and Secret
-       $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $_SESSION['request_token'], $_SESSION['request_token_secret']);
+       $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret);
 
        // Ok, let's get an Access Token. We'll need to pass along our oauth_verifier which was given to us in the URL.
-       $access_token = $tum_oauth->getAccessToken($_REQUEST['oauth_verifier']);
+       $access_token = $tum_oauth->getAccessToken($_REQUEST['oauth_verifier'], DI::session()->get('request_token'), DI::session()->get('request_token_secret'));
 
        // We're done with the Request Token and Secret so let's remove those.
-       unset($_SESSION['request_token']);
-       unset($_SESSION['request_token_secret']);
+       DI::session()->remove('request_token');
+       DI::session()->remove('request_token_secret');
 
        // Make sure nothing went wrong.
        if (200 == $tum_oauth->http_code) {
@@ -172,128 +177,79 @@ function tumblr_callback(App $a)
        }
 
        // What's next?  Now that we have an Access Token and Secret, we can make an API call.
-       DI::pConfig()->set(local_user(), "tumblr", "oauth_token", $access_token['oauth_token']);
-       DI::pConfig()->set(local_user(), "tumblr", "oauth_token_secret", $access_token['oauth_token_secret']);
+       DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'tumblr', 'oauth_token', $access_token['oauth_token']);
+       DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'tumblr', 'oauth_token_secret', $access_token['oauth_token_secret']);
 
-       $o = DI::l10n()->t("You are now authenticated to tumblr.");
-       $o .= '<br /><a href="' . DI::baseUrl()->get() . '/settings/connectors">' . DI::l10n()->t("return to the connector page") . '</a>';
-
-       return $o;
+       DI::baseUrl()->redirect('settings/connectors/tumblr');
 }
 
-function tumblr_jot_nets(App $a, array &$jotnets_fields)
+function tumblr_jot_nets(array &$jotnets_fields)
 {
-       if (! local_user()) {
+       if (!DI::userSession()->getLocalUserId()) {
                return;
        }
 
-       if (DI::pConfig()->get(local_user(),'tumblr','post')) {
+       if (DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'tumblr', 'post')) {
                $jotnets_fields[] = [
                        'type' => 'checkbox',
                        'field' => [
                                'tumblr_enable',
                                DI::l10n()->t('Post to Tumblr'),
-                               DI::pConfig()->get(local_user(),'tumblr','post_by_default')
+                               DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'tumblr', 'post_by_default')
                        ]
                ];
        }
 }
 
-function tumblr_settings(App $a, &$s)
+function tumblr_settings(array &$data)
 {
-       if (! local_user()) {
+       if (!DI::userSession()->getLocalUserId()) {
                return;
        }
 
-       /* Add our stylesheet to the page so we can make our settings look nice */
-
-       DI::page()['htmlhead'] .= '<link rel="stylesheet"  type="text/css" href="' . DI::baseUrl()->get() . '/addon/tumblr/tumblr.css' . '" media="all" />' . "\r\n";
-
-       /* Get the current state of our config variables */
-
-       $enabled = DI::pConfig()->get(local_user(), 'tumblr', 'post');
-       $checked = (($enabled) ? ' checked="checked" ' : '');
-       $css = (($enabled) ? '' : '-disabled');
-
-       $def_enabled = DI::pConfig()->get(local_user(), 'tumblr', 'post_by_default');
-
-       $def_checked = (($def_enabled) ? ' checked="checked" ' : '');
-
-       /* Add some HTML to the existing form */
-
-       $s .= '<span id="settings_tumblr_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_tumblr_expanded\'); openClose(\'settings_tumblr_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/tumblr.png" /><h3 class="connector">'. DI::l10n()->t('Tumblr Export').'</h3>';
-       $s .= '</span>';
-       $s .= '<div id="settings_tumblr_expanded" class="settings-block" style="display: none;">';
-       $s .= '<span class="fakelink" onclick="openClose(\'settings_tumblr_expanded\'); openClose(\'settings_tumblr_inflated\');">';
-       $s .= '<img class="connector'.$css.'" src="images/tumblr.png" /><h3 class="connector">'. DI::l10n()->t('Tumblr Export').'</h3>';
-       $s .= '</span>';
-
-       $s .= '<div id="tumblr-username-wrapper">';
-       $s .= '<a href="'.DI::baseUrl()->get().'/tumblr/connect">'.DI::l10n()->t("(Re-)Authenticate your tumblr page").'</a>';
-       $s .= '</div><div class="clear"></div>';
-
-       $s .= '<div id="tumblr-enable-wrapper">';
-       $s .= '<label id="tumblr-enable-label" for="tumblr-checkbox">' . DI::l10n()->t('Enable Tumblr Post Addon') . '</label>';
-       $s .= '<input type="hidden" name="tumblr" value="0"/>';
-       $s .= '<input id="tumblr-checkbox" type="checkbox" name="tumblr" value="1" ' . $checked . '/>';
-       $s .= '</div><div class="clear"></div>';
-
-       $s .= '<div id="tumblr-bydefault-wrapper">';
-       $s .= '<label id="tumblr-bydefault-label" for="tumblr-bydefault">' . DI::l10n()->t('Post to Tumblr by default') . '</label>';
-       $s .= '<input type="hidden" name="tumblr_bydefault" value="0"/>';
-       $s .= '<input id="tumblr-bydefault" type="checkbox" name="tumblr_bydefault" value="1" ' . $def_checked . '/>';
-       $s .= '</div><div class="clear"></div>';
-
-       $oauth_token = DI::pConfig()->get(local_user(), "tumblr", "oauth_token");
-       $oauth_token_secret = DI::pConfig()->get(local_user(), "tumblr", "oauth_token_secret");
-
-       $s .= '<div id="tumblr-page-wrapper">';
-
-       if (($oauth_token != "") && ($oauth_token_secret != "")) {
-               $page = DI::pConfig()->get(local_user(), 'tumblr', 'page');
-               $consumer_key = DI::config()->get('tumblr', 'consumer_key');
-               $consumer_secret = DI::config()->get('tumblr', 'consumer_secret');
-
-               $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);
-
-               $userinfo = $tum_oauth->get('user/info');
-
-               $blogs = [];
+       $enabled     = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'tumblr', 'post', false);
+       $def_enabled = DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'tumblr', 'post_by_default', false);
 
-               $s .= '<label id="tumblr-page-label" for="tumblr-page">' . DI::l10n()->t('Post to page:') . '</label>';
-               $s .= '<select name="tumblr_page" id="tumblr-page">';
-               foreach($userinfo->response->user->blogs as $blog) {
-                       $blogurl = substr(str_replace(["http://", "https://"], ["", ""], $blog->url), 0, -1);
+       $blogs = tumblr_get_blogs(DI::userSession()->getLocalUserId());
+       if (!empty($blogs)) {
+               $page = tumblr_get_page(DI::userSession()->getLocalUserId(), $blogs);
+       
+               $page_select = ['tumblr_page', DI::l10n()->t('Post to page:'), $page, '', $blogs];
+       }
 
-                       if ($page == $blogurl) {
-                               $s .= "<option value='".$blogurl."' selected>".$blogurl."</option>";
-                       } else {
-                               $s .= "<option value='".$blogurl."'>".$blogurl."</option>";
-                       }
-               }
+       $t    = Renderer::getMarkupTemplate('connector_settings.tpl', 'addon/tumblr/');
+       $html = Renderer::replaceMacros($t, [
+               '$l10n' => [
+                       'connect'   => DI::l10n()->t('(Re-)Authenticate your tumblr page'),
+                       'noconnect' => DI::l10n()->t('You are not authenticated to tumblr'),
+               ],
 
-               $s .= "</select>";
-       } else {
-               $s .= DI::l10n()->t("You are not authenticated to tumblr");
-       }
+               '$authenticate_url' => DI::baseUrl() . '/tumblr/connect',
 
-       $s .= '</div><div class="clear"></div>';
+               '$enable'      => ['tumblr', DI::l10n()->t('Enable Tumblr Post Addon'), $enabled],
+               '$bydefault'   => ['tumblr_bydefault', DI::l10n()->t('Post to Tumblr by default'), $def_enabled],
+               '$page_select' => $page_select ?? '',
+       ]);
 
-       /* provide a submit button */
-       $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="tumblr-submit" name="tumblr-submit" class="settings-submit" value="' . DI::l10n()->t('Save Settings') . '" /></div></div>';
+       $data = [
+               'connector' => 'tumblr',
+               'title'     => DI::l10n()->t('Tumblr Export'),
+               'image'     => 'images/tumblr.png',
+               'enabled'   => $enabled,
+               'html'      => $html,
+       ];
 }
 
-function tumblr_settings_post(App $a, array &$b)
+function tumblr_settings_post(array &$b)
 {
        if (!empty($_POST['tumblr-submit'])) {
-               DI::pConfig()->set(local_user(), 'tumblr', 'post',            intval($_POST['tumblr']));
-               DI::pConfig()->set(local_user(), 'tumblr', 'page',            $_POST['tumblr_page']);
-               DI::pConfig()->set(local_user(), 'tumblr', 'post_by_default', intval($_POST['tumblr_bydefault']));
+               DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'tumblr', 'post',            intval($_POST['tumblr']));
+               DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'tumblr', 'page',            $_POST['tumblr_page']);
+               DI::pConfig()->set(DI::userSession()->getLocalUserId(), 'tumblr', 'post_by_default', intval($_POST['tumblr_bydefault']));
        }
 }
 
-function tumblr_hook_fork(&$a, &$b)
+function tumblr_hook_fork(array &$b)
 {
        if ($b['name'] != 'notifier_normal') {
                return;
@@ -301,14 +257,16 @@ function tumblr_hook_fork(&$a, &$b)
 
        $post = $b['data'];
 
-       if ($post['deleted'] || $post['private'] || ($post['created'] !== $post['edited']) ||
-               !strstr($post['postopts'], 'tumblr') || ($post['parent'] != $post['id'])) {
+       if (
+               $post['deleted'] || $post['private'] || ($post['created'] !== $post['edited']) ||
+               !strstr($post['postopts'] ?? '', 'tumblr') || ($post['parent'] != $post['id'])
+       ) {
                $b['execute'] = false;
                return;
        }
 }
 
-function tumblr_post_local(App $a, array &$b)
+function tumblr_post_local(array &$b)
 {
        // This can probably be changed to allow editing by pointing to a different API endpoint
 
@@ -316,7 +274,7 @@ function tumblr_post_local(App $a, array &$b)
                return;
        }
 
-       if (!local_user() || (local_user() != $b['uid'])) {
+       if (!DI::userSession()->getLocalUserId() || (DI::userSession()->getLocalUserId() != $b['uid'])) {
                return;
        }
 
@@ -324,11 +282,11 @@ function tumblr_post_local(App $a, array &$b)
                return;
        }
 
-       $tmbl_post   = intval(DI::pConfig()->get(local_user(), 'tumblr', 'post'));
+       $tmbl_post   = intval(DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'tumblr', 'post'));
 
        $tmbl_enable = (($tmbl_post && !empty($_REQUEST['tumblr_enable'])) ? intval($_REQUEST['tumblr_enable']) : 0);
 
-       if ($b['api_source'] && intval(DI::pConfig()->get(local_user(), 'tumblr', 'post_by_default'))) {
+       if ($b['api_source'] && intval(DI::pConfig()->get(DI::userSession()->getLocalUserId(), 'tumblr', 'post_by_default'))) {
                $tmbl_enable = 1;
        }
 
@@ -343,139 +301,246 @@ function tumblr_post_local(App $a, array &$b)
        $b['postopts'] .= 'tumblr';
 }
 
-
-
-
-function tumblr_send(App $a, array &$b) {
-
+function tumblr_send(array &$b)
+{
        if ($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited'])) {
                return;
        }
 
-       if (! strstr($b['postopts'],'tumblr')) {
+       if (!strstr($b['postopts'], 'tumblr')) {
                return;
        }
 
-       if ($b['parent'] != $b['id']) {
+       if ($b['gravity'] != Item::GRAVITY_PARENT) {
                return;
        }
 
-       // Dont't post if the post doesn't belong to us.
-       // This is a check for forum postings
-       $self = DBA::selectFirst('contact', ['id'], ['uid' => $b['uid'], 'self' => true]);
-       if ($b['contact-id'] != $self['id']) {
+       if (tumblr_send_npf($b)) {
                return;
        }
 
-       $b['body'] = Post\Media::addAttachmentsToBody($b['uri-id'], $b['body']);
+       $connection = tumblr_connection($b['uid']);
+       if (empty($connection)) {
+               return;
+       }
 
-       $oauth_token = DI::pConfig()->get($b['uid'], "tumblr", "oauth_token");
-       $oauth_token_secret = DI::pConfig()->get($b['uid'], "tumblr", "oauth_token_secret");
-       $page = DI::pConfig()->get($b['uid'], "tumblr", "page");
-       $tmbl_blog = 'blog/' . $page . '/post';
+       $b['body'] = BBCode::removeAttachment($b['body']);
+
+       $title = trim($b['title']);
+
+       $media = Post\Media::getByURIId($b['uri-id'], [Post\Media::HTML, Post\Media::AUDIO, Post\Media::VIDEO, Post\Media::IMAGE]);
+
+       $photo = array_search(Post\Media::IMAGE, array_column($media, 'type'));
+       $link  = array_search(Post\Media::HTML, array_column($media, 'type'));
+       $audio = array_search(Post\Media::AUDIO, array_column($media, 'type'));
+       $video = array_search(Post\Media::VIDEO, array_column($media, 'type'));
+
+       $params = [
+               'state'  => 'published',
+               'tags'   => implode(',', array_column(Tag::getByURIId($b['uri-id']), 'name')),
+               'tweet'  => 'off',
+               'format' => 'html',
+       ];
+
+       $body = BBCode::removeShareInformation($b['body']);
+       $body = Post\Media::removeFromEndOfBody($body);
+
+       if ($photo !== false) {
+               $params['type'] = 'photo';
+               $params['caption'] = BBCode::convertForUriId($b['uri-id'], $body, BBCode::CONNECTORS);
+               $params['data'] = [];
+               foreach ($media as $photo) {
+                       if ($photo['type'] == Post\Media::IMAGE) {
+                               if (Network::isLocalLink($photo['url']) && ($data = Photo::getResourceData($photo['url']))) {
+                                       $photo = Photo::selectFirst([], ["`resource-id` = ? AND `scale` > ?", $data['guid'], 0]);
+                                       if (!empty($photo)) {
+                                               $params['data'][] = Photo::getImageDataForPhoto($photo);
+                                       }
+                               }
+                       }
+               }
+       } elseif ($link !== false) {
+               $params['type']        = 'link';
+               $params['title']       = $media[$link]['name'];
+               $params['url']         = $media[$link]['url'];
+               $params['description'] = BBCode::convertForUriId($b['uri-id'], $body, BBCode::CONNECTORS);
+
+               if (!empty($media[$link]['preview'])) {
+                       $params['thumbnail'] = $media[$link]['preview'];
+               }
+               if (!empty($media[$link]['description'])) {
+                       $params['excerpt'] = $media[$link]['description'];
+               }
+               if (!empty($media[$link]['author-name'])) {
+                       $params['author'] = $media[$link]['author-name'];
+               }
+       } elseif ($audio !== false) {
+               $params['type']         = 'audio';
+               $params['external_url'] = $media[$audio]['url'];
+               $params['caption']      = BBCode::convertForUriId($b['uri-id'], $body, BBCode::CONNECTORS);
+       } elseif ($video !== false) {
+               $params['type']    = 'video';
+               $params['embed']   = $media[$video]['url'];
+               $params['caption'] = BBCode::convertForUriId($b['uri-id'], $body, BBCode::CONNECTORS);
+       } else {
+               $params['type']  = 'text';
+               $params['title'] = $title;
+               $params['body']  = BBCode::convertForUriId($b['uri-id'], $b['body'], BBCode::CONNECTORS);
+       }
 
-       if ($oauth_token && $oauth_token_secret && $tmbl_blog) {
-               $tags = Tag::getByURIId($b['uri-id']);
+       if (isset($params['caption']) && (trim($title) != '')) {
+               $params['caption'] = '<h1>' . $title . '</h1>' .
+                       '<p>' . $params['caption'] . '</p>';
+       }
 
-               $tag_arr = [];
+       $page = tumblr_get_page($b['uid']);
 
-               foreach($tags as $tag) {
-                       $tag_arr[] = $tag['name'];
-               }
+       $result = tumblr_post($connection, 'blog/' . $page . '/post', $params);
 
-               if (count($tag_arr)) {
-                       $tags = implode(',', $tag_arr);
-               }
+       if ($result['success']) {
+               Logger::info('success', ['blog' => $page, 'params' => $params]);
+               return true;
+       } else {
+               Logger::notice('error', ['blog' => $page, 'params' => $params, 'result' => $result['data']]);
+               return false;
+       }
+}
 
-               $title = trim($b['title']);
+function tumblr_send_npf(array $post): bool
+{
+       $page = tumblr_get_page($post['uid']);
 
-               $siteinfo = BBCode::getAttachedData($b["body"]);
+       $connection = tumblr_connection($post['uid']);
+       if (empty($page)) {
+               Logger::notice('Missing page, post will not be send to Tumblr.', ['uid' => $post['uid'], 'page' => $page, 'id' => $post['id']]);
+               // "true" is returned, since the legacy function will fail as well.
+               return true;
+       }
+       
+       $post['body'] = Post\Media::addAttachmentsToBody($post['uri-id'], $post['body']);
+       if (!empty($post['title'])) {
+               $post['body'] = '[h1]' . $post['title'] . "[/h1]\n" . $post['body'];
+       }
 
-               $params = [
-                       'state'  => 'published',
-                       'tags'   => $tags,
-                       'tweet'  => 'off',
-                       'format' => 'html',
-               ];
+       $params = [
+               'content'                => NPF::fromBBCode($post['body'], $post['uri-id']),
+               'state'                  => 'published',
+               'date'                   => DateTimeFormat::utc($post['created'], DateTimeFormat::ATOM),
+               'tags'                   => implode(',', array_column(Tag::getByURIId($post['uri-id']), 'name')),
+               'is_private'             => false,
+               'interactability_reblog' => 'everyone'
+       ];
 
-               if (!isset($siteinfo["type"])) {
-                       $siteinfo["type"] = "";
-               }
+       $result = tumblr_post($connection, 'blog/' . $page . '/posts', $params);
 
-               if (($title == "") && isset($siteinfo["title"])) {
-                       $title = $siteinfo["title"];
-               }
+       if ($result['success']) {
+               Logger::info('success', ['blog' => $page, 'params' => $params]);
+               return true;
+       } else {
+               Logger::notice('error', ['blog' => $page, 'params' => $params, 'result' => $result['data']]);
+               return false;
+       }
+}
 
-               if (isset($siteinfo["text"])) {
-                       $body = $siteinfo["text"];
-               } else {
-                       $body = BBCode::removeShareInformation($b["body"]);
-               }
+function tumblr_connection(int $uid): GuzzleHttp\Client|null
+{
+       $oauth_token        = DI::pConfig()->get($uid, 'tumblr', 'oauth_token');
+       $oauth_token_secret = DI::pConfig()->get($uid, 'tumblr', 'oauth_token_secret');
 
-               switch ($siteinfo["type"]) {
-                       case "photo":
-                               $params['type']    = "photo";
-                               $params['caption'] = BBCode::convertForUriId($b['uri-id'], $body, BBCode::CONNECTORS);;
+       $consumer_key    = DI::config()->get('tumblr', 'consumer_key');
+       $consumer_secret = DI::config()->get('tumblr', 'consumer_secret');
 
-                               if (isset($siteinfo["url"])) {
-                                       $params['link'] = $siteinfo["url"];
-                               }
+       if (!$consumer_key || !$consumer_secret || !$oauth_token || !$oauth_token_secret) {
+               Logger::notice('Missing data, connection is not established', ['uid' => $uid]);
+               return null;
+       }
+       return tumblr_client($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);
+}
 
-                               $params['source'] = $siteinfo["image"];
-                               break;
+function tumblr_client(string $consumer_key, string $consumer_secret, string $oauth_token, string $oauth_token_secret): GuzzleHttp\Client
+{
+       $stack = HandlerStack::create();
 
-                       case "link":
-                               $params['type']        = "link";
-                               $params['title']       = $title;
-                               $params['url']         = $siteinfo["url"];
-                               $params['description'] = BBCode::convertForUriId($b['uri-id'], $body, BBCode::CONNECTORS);
-                               break;
+       $middleware = new Oauth1([
+               'consumer_key'    => $consumer_key,
+               'consumer_secret' => $consumer_secret,
+               'token'           => $oauth_token,
+               'token_secret'    => $oauth_token_secret
+       ]);
+       $stack->push($middleware);
+       
+       return new Client([
+               'base_uri' => 'https://api.tumblr.com/v2/',
+               'handler' => $stack
+       ]);
+}
 
-                       case "audio":
-                               $params['type']         = "audio";
-                               $params['external_url'] = $siteinfo["url"];
-                               $params['caption']      = BBCode::convertForUriId($b['uri-id'], $body, BBCode::CONNECTORS);
-                               break;
+function tumblr_get_page(int $uid, array $blogs = [])
+{
+       $page = DI::pConfig()->get($uid, 'tumblr', 'page');
 
-                       case "video":
-                               $params['type']    = "video";
-                               $params['embed']   = $siteinfo["url"];
-                               $params['caption'] = BBCode::convertForUriId($b['uri-id'], $body, BBCode::CONNECTORS);
-                               break;
+       if (!empty($page) && (strpos($page, '/') === false)) {
+               return $page;
+       }
 
-                       default:
-                               $params['type']  = "text";
-                               $params['title'] = $title;
-                               $params['body']  = BBCode::convertForUriId($b['uri-id'], $b['body'], BBCode::CONNECTORS);
-                               break;
-               }
+       if (empty($blogs)) {
+               $blogs = tumblr_get_blogs($uid);
+       }
 
-               if (isset($params['caption']) && (trim($title) != "")) {
-                       $params['caption'] = '<h1>'.$title."</h1>".
-                                               "<p>".$params['caption']."</p>";
-               }
+       if (!empty($blogs)) {
+               $page = array_key_first($blogs);
+               DI::pConfig()->set($uid, 'tumblr', 'page', $page);
+               return $page;
+       }
 
-               if (empty($params['caption']) && !empty($siteinfo["description"])) {
-                       $params['caption'] = BBCode::convertForUriId($b['uri-id'], "[quote]" . $siteinfo["description"] . "[/quote]", BBCode::CONNECTORS);
-               }
+       return '';
+}
 
-               $consumer_key = DI::config()->get('tumblr','consumer_key');
-               $consumer_secret = DI::config()->get('tumblr','consumer_secret');
+function tumblr_get_blogs(int $uid)
+{
+       $connection = tumblr_connection($uid);
+       if (empty($connection)) {
+               return [];
+       }
 
-               $tum_oauth = new TumblrOAuth($consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret);
+       $userinfo = tumblr_get($connection, 'user/info');
+       if (empty($userinfo['success'])) {
+               return [];
+       }
 
-               // Make an API call with the TumblrOAuth instance.
-               $x = $tum_oauth->post($tmbl_blog,$params);
-               $ret_code = $tum_oauth->http_code;
+       $blogs = [];
+       foreach ($userinfo['data']->response->user->blogs as $blog) {
+               $blogs[$blog->uuid] = $blog->name;
+       }
+       return $blogs;
+}
 
-               //print_r($params);
-               if ($ret_code == 201) {
-                       Logger::log('tumblr_send: success');
-               } elseif ($ret_code == 403) {
-                       Logger::log('tumblr_send: authentication failure');
-               } else {
-                       Logger::log('tumblr_send: general error: ' . print_r($x,true));
-               }
+function tumblr_get($connection, string $url)
+{
+       try {
+               $res = $connection->get($url, ['auth' => 'oauth']);
+
+               $success = true;
+               $data    = json_decode($res->getBody()->getContents());
+       } catch (RequestException $exception) {
+               $success = false;
+               $data    = [];
+               Logger::notice('Request failed', ['code' => $exception->getCode(), 'message' => $exception->getMessage()]);
        }
+       return ['success' => $success, 'data' => $data];
 }
 
+function tumblr_post($connection, string $url, array $parameter)
+{
+       try {
+               $res = $connection->post($url, ['auth' => 'oauth', 'json' => $parameter]);
+
+               $success = true;
+               $data    = json_decode($res->getBody()->getContents());
+       } catch (RequestException $exception) {
+               $success = false;
+               $data    = json_decode($exception->getResponse()->getBody()->getContents());
+               Logger::notice('Post failed', ['code' => $exception->getCode(), 'message' => $exception->getMessage()]);
+       }
+       return ['success' => $success, 'data' => $data];
+}
\ No newline at end of file